私のUser
モデルでは、これがあります:
attr_accessible :role_ids, :as => :admin
しかし、それはうまくいかないようです。
この特定の属性には、次の場合にのみアクセスできるcurrent_user.can?(:edit, Role)
ようにしたいと考えています。admin
superadmin
どうすればいいですか?
編集 1: 私は Devise、CanCan、Rolify を使用しています。
私のUser
モデルでは、これがあります:
attr_accessible :role_ids, :as => :admin
しかし、それはうまくいかないようです。
この特定の属性には、次の場合にのみアクセスできるcurrent_user.can?(:edit, Role)
ようにしたいと考えています。admin
superadmin
どうすればいいですか?
編集 1: 私は Devise、CanCan、Rolify を使用しています。
私が言ったように、属性を特定のロールに制限する最善の方法は、DHH が最近導入した強力なパラメーターgem を使用することだと考えています。ありがたいことに、これもRails4の一部になります。
適合しない場合でも、Rails 3 から 4 へのアップグレードが容易になるため、原則の統合を開始することをお勧めします。
Railscasts Pro メンバーシップをお持ちの場合は、Ryan Bates が別のすばらしいチュートリアルを作成しています。
簡単に言うと、その Railscast で推奨されていることは次のとおりです。
gem をインストールしたら、モデルから attr_accessible を削除します。
これを初期化子に追加します。
ActiveRecord::Base.send(:include, ActiveModel::ForbiddenAttributesProtection)
コントローラーで更新アクションを変更します::
def update
@topic = Topic.find(params[:id])
if @topic.update_attributes(topic_params)
redirect_to topics_url, notice: "Updated topic."
else
render :edit
end
end
コントローラーにプライベート メソッドを作成します。
def topic_params
if current_user && current_user.admin?
params[:topic].permit(:name, :sticky)
else
params[:topic].permit(:name)
end
end
あなたの状況では、私たちと同じように、自分のロールを使用するように topic_params メソッドを変更する必要があります。
RailsCast にはさらにいくつかの提案があり、9 ドルの価値があります。(私はこのサイトとはまったく関係がありません。私たちにとってかけがえのないものであることが証明されているだけです)
これが役立つかどうか教えてください。
私のユーザーモデルで
class User
attr_accessible :nickname, as: :admin
end
私のレールコンソールで
User.first.update_attributes!({nickname: "uschi"})
# WARNING: Can't mass-assign protected attributes: nickname
User.first.update_attributes!({nickname: "uschi"}, {as: :admin})
# true
アップデート
たぶん私はあなたの問題を理解するのは愚かですが、ただやってください
if current_user.can?(:edit, Role)
user.update_attributes!({nickname: "uschi"}, {as: :admin})
else
first.update_attributes!({nickname: "uschi"})
end
おそらくこれを行うよりスマートな方法があります...