7

私のUserモデルでは、これがあります:

attr_accessible :role_ids, :as => :admin

しかし、それはうまくいかないようです。

この特定の属性には、次の場合にのみアクセスできるcurrent_user.can?(:edit, Role)ようにしたいと考えています。adminsuperadmin

どうすればいいですか?

編集 1: 私は Devise、CanCan、Rolify を使用しています。

4

2 に答える 2

9

私が言ったように、属性を特定のロールに制限する最善の方法は、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 ドルの価値があります。(私はこのサイトとはまったく関係がありません。私たちにとってかけがえのないものであることが証明されているだけです)

これが役立つかどうか教えてください。

于 2012-12-16T11:45:16.223 に答える
0

私のユーザーモデルで

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

おそらくこれを行うよりスマートな方法があります...

于 2012-12-15T12:03:02.380 に答える