【问题标题】:Allowing cancan Ability.rb manage access only specific fields of a model允许 cancan Ability.rb 管理仅访问模型的特定字段
【发布时间】:2012-04-27 08:49:08
【问题描述】:

我正在尝试添加一个按钮以在 Rails 中将回复标记为已读。我目前有这样的东西。

# /app/models/ability.rb
...
can :manage, Reply, :user_id => user.id
...

我的 RepliesController 中也有 load_and_authorize_resource

# /app/controllers/replies_controller.rb
class RepliesController < ApplicationController
  load_and_authorize_resource

  def update 
    @reply = Reply.find(params[:id])
    @reply.isRead = true
    if @reply.save
      flash[:notice] = "Marked as ready."
      flash[:alert] = params[:id]
      redirect_to root_path
    else
      render :action => 'new'
    end
  end

我有一个按钮,用户可以在其中将回复标记为已读。

  = button_to "Mark as read", idea_reply_path(reply.idea,reply), :method => "put"

问题是,由于我试图从ability.rb(顶部)中定义的其他 user.id 所有者更新对象,因此我没有编辑它的权限。

如果我添加这样的内容它会起作用,但我也将管理整个回复对象的权限授予其他人。

can :manage, Reply, :to_user_id => user.id

我需要一种方法,只允许用户管理他的 user.id 与 to_user_id 匹配的对象的属性 isRead?

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 cancan


    【解决方案1】:

    您可以在控制器中定义一个新的操作,例如 mark_as_read

     def mark_as_read
      #action to mark as read  
     end
    

    在能力定义中

    can :manage, :Reply, :user_id => user.id
    can :mark_as_read, :to_user_id => user.id
    

    顺序很重要。现在登录的用户可以管理回复,并且作为用户的用户将只能标记为阅读。

    【讨论】:

    • 我建议为 mark_as_read 添加不同的操作,而不是授予更新操作的权限。以便更新操作可用于修改回复
    【解决方案2】:

    我认为你可以两者兼得

    can :manage, Reply, :user_id => user.id
    can :update, Reply, :to_user_id => user.id
    

    如果更新操作仅用于将回复标记为已读,那么这就是您想要的

    【讨论】:

      猜你喜欢
      • 2014-07-16
      • 2023-03-18
      • 1970-01-01
      • 2018-04-11
      • 2021-01-07
      • 1970-01-01
      • 1970-01-01
      • 2014-10-22
      相关资源
      最近更新 更多