Разрешить пользователям редактировать/удалять собственные профили только из индекса

Как предоставить разрешение на редактирование/удаление ссылок для каждого пользователя в пользовательском индексе рельсов?

Я использую Rails3, Devise и CanCan для определения способностей на основе ролей.

Я хотел бы, чтобы текущий пользователь мог видеть и получать доступ к ссылке для редактирования/удаления своего профиля на индексной странице пользователя. Они не должны иметь возможность видеть или получать доступ к этим ссылкам для всех других пользователей.

Я установил следующее в представлении индекса:

<% if can? :update, @user %>
     <%= link_to 'Edit', edit_user_registration_path(@user) %> | 
<% end %>

И в абилс.рб

def initialize(user) 
    can :update, User, :id => user.id
    if user.role? :super_admin
       can :manage, :all
    end
end

Мой суперадмин может видеть и редактировать ссылки для всех пользователей в индексе.

Мой пользователь не может видеть ссылки ни для кого, даже для себя.

Чем больше я читаю об этом, тем больше запутываюсь, что с разработкой, канканом и пользовательской моделью играют роль.

Я был бы признателен за подтверждение того, что я на правильном пути, и был бы признателен за любые указатели на полезную информацию, которая помогла бы мне понять это.

Большое спасибо


person Andy Harvey    schedule 29.04.2011    source источник


Ответы (4)


В способностях.рб

can :manage, User do |u|
  u.id == user.id
end

если вы хотите пройти по удостоверению личности.

Твоя точка зрения мне нравится.

person The Promised Landt    schedule 29.04.2011
comment
спасибо за ваше предложение. На самом деле я согласен с вами, я думал, что это сделает свое дело. К сожалению, это не так. Я задавался вопросом, было ли что-то противоречащее со стороны Devise, что я должен учитывать? А может я слишком усложняю? - person Andy Harvey; 29.04.2011

Это полный слепой выстрел, но, возможно, он сработает:

<% if can?(:update, @user) || @user==current_user %>
     <%= link_to 'Edit', edit_user_registration_path(@user) %> | 
<% end %>

Замените current_user тем, что содержит пользователя, вошедшего в систему в данный момент.

person Wukerplank    schedule 29.04.2011
comment
спасибо за предложение. Это не работает, к сожалению. Суперадмин по-прежнему может видеть все. Пользователь не может видеть ни одного. Это может быть глупый вопрос, поэтому, пожалуйста, потерпите меня. Как мне определить (или мне нужно определить) переменную @user в контроллере индекса. @user = User.find(params[:id]) приводит к ошибке Не удалось найти пользователя без идентификатора - person Andy Harvey; 29.04.2011

Попробуйте это и посмотрите, работает ли это (если у вас все еще есть эта проблема). Я не думаю, что ваш обычный пользователь должен находиться вне оператора if (измените переменную по своему усмотрению.)

def initialize(user)
 user ||= User.new #guest user
  if user.role? :super_admin
   can :manage, :all
  else
   can :update, User, :id => user.id
   can :read, :all # you can try it with this line removed at first
  end
end
person Sako Kassabian    schedule 12.05.2011

Вы сами запутались и таким образом еще больше усложняете себе задачу.
В какой-то момент вы говорите:

Я хотел бы, чтобы текущий пользователь мог видеть и получать доступ к ссылке для редактирования/удаления своего профиля на индексной странице пользователя. Они не должны иметь возможность видеть или получать доступ к этим ссылкам для всех других пользователей.

С другой стороны,

Мой суперадмин может видеть и редактировать ссылки для всех пользователей в индексе. Мой пользователь не может видеть ссылки ни для кого, даже для себя

Я понимаю, что вы пытаетесь сказать. Вы хотите:

  1. Суперадминистратор может видеть все ссылки на что угодно и
  2. Пользователь может видеть ссылки только для себя, и никого другого, и то тоже, только редактировать и обновлять профиль или даже можно добавить ссылки на удаление аккаунта. Но главная проблема в том, что пользователь может видеть ссылки только в своем профиле и больше нигде.

Некоторые моменты, которые следует учитывать:

Правильно ли вы распределили способности в классе способностей? Найдите что-то подобное в своем коде и посмотрите, работает ли это в консоли.

def current_ability
  @current_ability ||= Ability.new(current_user)
end

Если да, перейдите к этой части:

can :manage, User do |user|
  user == current_user #Assign the abilities for the user, here only,
# no need to match the id for each view in the link.
end

Если это все еще не работает, сделайте перерыв, еще раз пройдитесь по этим ссылкам, я знаю, что это может быть очень запутанным, но поверьте мне, вы довольно близко.

Wiki — Определение способностей
Wiki — Изменение значений по умолчанию

Когда вы доберетесь туда, не могли бы вы поделиться со мной своим подходом к тому, как вы все это сделали. Я хотел бы услышать от вас.

person Jatin Ganhotra    schedule 30.04.2011
comment
Спасибо за терпеливость. Я все еще ломаю голову над этим. Вот в чем дело — суперадмин can manage all, он может видеть и получать доступ ко всем изменениям/уничтожениям для всех пользователей в индексе. Но, если я скажу, что все пользователи can :manage, User, какой бы ни была их роль, то эти ссылки все равно никому не доступны. Как будто пользователь не является правильной моделью, для которой нужно устанавливать разрешения. - person Andy Harvey; 03.05.2011
comment
ps - если я потом поставлю всем пользователям can :manage, :all, то эти ссылки будут доступны всем! - person Andy Harvey; 03.05.2011
comment
@andy: Мне все еще неясны твои сомнения. Можете ли вы обновить вопрос и уточнить, что вы хотите. - person Jatin Ganhotra; 09.05.2011