0

Railsで返信を既読にするボタンを追加しようとしています。私は現在このようなものを持っています。

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

load_and_authorize_resourceRepliesControllerにもあります

# /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

isRead?user.idが。と一致するオブジェクトの属性のみをユーザーが管理できるようにする方法が必要ですto_user_id

4

2 に答える 2

3

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することしかできなくなります。

于 2012-04-27T00:49:08.087 に答える
0

私はあなたが両方を持つことができると思います

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

更新アクションが[返信を既読にする]のマークのみを対象としている場合は、それが必要です

于 2012-04-27T00:45:38.807 に答える