使い方:ロールベースの権限を持つattr_accessible
-
16-09-2019 - |
質問
は、私のオンラインストアでは、ユーザーは他の人に自分の注文(例えば、その請求先住所)の特定のプロパティを変更することはできますが、されていない(例えば、発信IPアドレス)。管理者は、他の一方で、すべてののためのプロパティをを変更することが許可されています。
を考えると、これは、どのように私はきちんと私の注文モデルを確保するために:attr_accessible
を使用することができますか?または私はすべての管理者が変更して、普通のユーザーがアクセスすることができ、これらのコントローラのアクションでOrder.update_attributes(params[:order])
の使用を控えることを属性?
解決
一般的に言って、attr_accessibleは、あなたが探しているとRailsは、その中に組み込まれて何も付属していないツールが何をしたいんではありません。
あなたがモデル内の特定の属性を更新できる人を細かく制御したい場合は、あなたのような何かを行うことができます:
class Order < ActiveRecord::Base
def update_attributes_as_user(values, user)
values.each do |attribute, value|
# Update the attribute if the user is allowed to
@order.send("#{attribute}=", value) if user.can_modify?(attribute)
end
save
end
end
次に、あなたがOrder.update_attributes(params[:order])
すると、あなたが正しい場合にtrueを返すようにOrder.update_attributes_as_user(params[:order], current_user)
メソッドを実装すると仮定すると、それが動作するはずですあなたのUser#can_modify?
を変更することができます。
他のヒント
私は同じ問題を抱えていたし、今私は http://github.com/dmitry/この宝石を使用していますattr_accessible_blockする
これは簡単で、いくつかの生産のウェブサイトで使用されます。
はい、あなたは権限がアクション内で確認されているので、アクションを変更する必要があります。 Order#update_attributes
を呼び出すと、一般的なユーザーのために動作しません。
私は、あなたが探している何かをできるようになる役割ベースの認証プラグインをremberすることはできません。これらのプラグインは、コントローラではなくモデルにミックスインからです。彼らはまた、ActiveRecord::Base
などを確認するためにattr_accesible
にミックスインする必要があります。