2

クリアランスレベルを決定するために保護されているユーザーモデルのフィールドがあります。したがって、保護されたままにして、一括割り当てできないようにする必要があります。したがって、3.2では属性がデフォルトで保護されていますが、それが実際に私が望む動作です。

ただし、1つのコントローラーメソッドでは、たとえばユーザーの作成やユーザーの更新時に、マネージャーがこのフィールドを割り当てることができるようにしたいと思います。

特定のコントローラーアクションにその属性を割り当てるにはどうすればよいですか?

たとえば、私は自分のコントローラーを持っています:

# app/controllers/admin/users_controller.rb

def create
    @user = User.new(params[:user])
# ...
end

今、私がすることはclearanceから除外することですがparams[:user]、その行に到達する前でも、フィルターで除外されて発生し、例外が発生するようです(その行のdebugger直前に配置してコメントアウトしようとしましたが、それでも例外が発生しました)。

呼び出し時に保護されていない場合、保護された属性はどこでキャッチされますUser#newか?

4

2 に答える 2

4

これを行うRailsの方法は、保護なしで属性を割り当てるか、管理者ロールを使用することです。

@user = User.new
@user.assign_attributes(params[:user], :without_protection => true)
@user.save

ただし、これは少し面倒であることがわかったので、(私の意見では)より優れたAPIを提供するsudo_attributesというgemを作成しました。

@user = User.sudo_new(params[:user])
@user.save

これは、Railsのインスタンス化、作成、および更新のすべてのメソッド(new、build、create、create!、update_attributesなど)を模倣しています。

于 2012-06-12T01:48:06.780 に答える
0

以前は、この種の操作に、次の値のみを設定する独自の包含メソッドを与えることを好みました。

# app/controllers/admin/users_controller.rb

def full_clearance
  User.find(params[:id]).update_attribute(:clearance, 'full')
end

def restricted_clearance
  User.find(params[:id]).update_attribute(:clearance, 'restricted')
end

今、Beerlingtonが言及したRailsの方法を見て、私はむしろ役割を使用して、その特定のアクションにクリアランス属性へのアクセスを与えたいと思います。

# /app/models/user.rb

attr_accessible :attributes_accessible_by_default, ..., :clearance, :as => :manager

# app/controllers/admin/users_controller.rb

def create
    @user = User.new(params[:user].merge(:as => :manager)
# ...
end

その場合、ユーザーの役割属性に基づいてアクセスを許可することも可能です。

# app/controllers/admin/users_controller.rb

def create
    @user = User.new(params[:user].merge(:as => current_user.role.to_sym)
# ...
end

ただし、エラーが再度発生する可能性があります。

于 2012-06-12T19:41:23.493 に答える