1

Rails 3 アプリにデバイス認証を追加しようとしています。このチュートリアルに従って、管理者ユーザーのみに role_ids の attr_accessible を動的に設定しようとしている以外は、すべてうまくいっています (通常のユーザーがロールを変更することは望ましくありませんが、管理者は変更できるはずです)... 問題は、 railscast チュートリアルのアプローチでは、実際にはデバイスが内部ですべてを処理しているときに、コントローラーの動作を変更するアクセス権があることを前提としています。

助けてください

4

2 に答える 2

1

Devise コントローラをサブクラス化できます。ビューを生成して正しい場所に移動するだけです。Devise readme の「ビューの構成」と「コントローラーの構成」を確認してください。

最終的に、role_ids を attr_accessible に追加してから、RegistrationsController をサブクラス化し、before_filter を追加して、非管理者のそのパラメーターを削除しました。

class Users::RegistrationsController < Devise::RegistrationsController
  before_filter :remove_admin_params, :only => [:create, :update]

protected
  # disable setting the role_ids value unless an admin is doing the edit.
  def remove_admin_params
    params[:user].delete(:role_ids) unless current_user.try(:admin?)
  end
end

必ず登録ビューを に追加して/app/views/users/registrations/ください。

于 2011-02-21T19:50:02.203 に答える
0

これを処理するために私が見つけた最良の方法は、RailsCast 237からのものです。Arrel の回答よりも詳細ですが、attr_accessible にロール (または他のフィールド) を追加する必要はありません。

次のメソッドをイニシャライザに追加します。

class ActiveRecord::Base
  attr_accessible
  attr_accessor :accessible

  private

  def mass_assignment_authorizer(role = :default)
    if accessible == :all
      self.class.protected_attributes # hack
    else
      # super returns a whitelist object
      super + (accessible || [])
    end
  end
end

次に、コントローラーで次のことができます。

user.accessible = :role できる場合は? :set_role、リソース

残念ながら、この呼び出しは、ユーザー (またはその他の) オブジェクトがインスタンス化された後に行う必要があります。つまり、コントローラーをサブクラス化し、更新と作成でリソースをインスタンス化した後にこれを呼び出す必要があります。

これは Rails 3.2 用です。以前のバージョンでは、メソッド mass_assignment_authorizer はパラメーターを取らないと思います。値のない attr_accessible は、一括割り当てに対するフェイルセーフ アプリケーション全体の拒否を設定します。これは、application.rb ファイルでも実行できます。

config.active_record.whitelist_attributes = true
于 2012-08-20T01:08:09.347 に答える