Ruby On Rails Rolify + CanCanCan + Devise позволяют пользователю редактировать только свои сообщения


person pavjel    schedule 27.01.2016    source источник


Ответы (2)


Вам просто нужно передать user_id в hash conditions:

#app/models/ability.rb
class Ability
  include CanCan::Ability

  def initialize(user)
    user ||= User.new # guest user (not logged in)
    if user.has_role? :admin
      can :manage, :all
    else
      can :manage, Post, user_id: user.id #-> CRUD own posts only
      can :read, :all #-> read everything
    end
  end
end

Это позволит вам использовать:

#app/views/posts/index.html.erb
<%= render @posts %>

#app/views/posts/_post.html.erb
<% if can? :read, post %>
   <%= post.body %>
   <%= link_to "Edit", edit_post_path(post), if can? :edit, post %>
<% end %>
person Richard Peck    schedule 27.01.2016
comment
Большое спасибо! Работал как шарм! - person pavjel; 27.01.2016
comment
Спасибо, чувак, на днях я потратил около 6 часов на что-то подобное. - person Richard Peck; 27.01.2016
comment
Ну, я совсем новичок в рубине и рубине на рельсах в целом, я не знаю, что бы я делал без SO (очевидно, я бы прочитал документы, но это заняло бы слишком много времени) :) - person pavjel; 27.01.2016
comment
Честно говоря, документы лучше всего подходят для справки; если вы хотите добиться чего-то конкретного, гораздо эффективнее увидеть, что сделали другие. - person Richard Peck; 27.01.2016
comment
В моем случае это не работает (Rails 6.0.3.2), часть ссылки, если можно? : edit, сообщение вызывает сбой просмотра. Но с другой стороны, я не знаю, как это исправить, чтобы это работало. Поставить ‹%, если можно? :edit, Сообщение %› перед ссылкой приводит к тому, что Edit появляется, когда оно не должно появляться, и щелчок по нему дает, что Вы не авторизованы для доступа к этой странице. - person Clarity; 19.08.2020

Я согласен с ответом Ричарда Пека. Тем не менее, я просто хотел бы отметить, что обслуживание гостевого пользователя (не вошедшего в систему) не требуется. Инициализатор вызывается при создании экземпляра нового объекта (т. е. конструктора объекта).

Таким образом, приведенный выше класс Способностей может быть следующим:

#app/models/ability.rb
class Ability
 include CanCan::Ability

 def initialize(user)

  if user.has_role? :admin
    can :manage, :all
  else
    can :manage, Post, user_id: user.id #-> CRUD own posts only
    can :read, :all #-> read everything
  end
 end
end
person Richard O'Brien    schedule 15.08.2016