Разрешить пользователям редактировать / уничтожать свои собственные профили только из индекса - PullRequest
0 голосов
/ 29 апреля 2011

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

Я использую 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

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

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

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

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

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

Ответы [ 4 ]

3 голосов
/ 29 апреля 2011

In abilities.rb

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

, если вы хотите перейти по идентификатору.

Ваш взгляд мне нравится.

2 голосов
/ 12 мая 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
2 голосов
/ 29 апреля 2011

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

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

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

0 голосов
/ 30 апреля 2011

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

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

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

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

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

  1. SuperAdmin может видеть все ссылки для чего угодно, и
  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 - Changing-Defaults

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

...