56

Rails 4 アプリケーションに Devise を追加し、 User モデルにユーザー名などを正常に追加しました。さらに、lazy way™ を使用してこれらのフィールドを保存できます。

class ApplicationController < ActionController::Base
  before_filter :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) } 
    end
end

しかし、私は試しました

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
  devise_parameter_sanitizer.for(:edit) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname) }
end

しかし、それは期待どおりには機能しませんでした (編集アクションによって呼び出されたときにユーザー名が保存されません)。それを機能させるために他に何かする必要がありますか?ありがとう!

4

4 に答える 4

91

やはり、説明書を読む問題でした...

魔法の言葉は:account_update、したがって、作業バージョンは

def configure_permitted_parameters
  devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :firstname, :middlename, :lastname, :nickname) }
  devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password, :firstname, :middlename, :lastname, :nickname) }
end

非標準のパラメーターを使用してサインインするビジネスをしている場合、探している単語は:sign_in(予想どおり) であることに注意してください。

于 2013-11-05T16:05:16.303 に答える
70

Devise 4.1 以降の場合

class ApplicationController < ActionController::Base    
  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:first_name, :last_name, :email])
    devise_parameter_sanitizer.permit(:account_update, keys: [:first_name, :last_name, :phone, :email, bank_attributes: [:bank_name, :bank_account]])
  end
end

この.forメソッドは廃止されました。現在は使用しています.permit

最初の引数はアクション名です。:sign_up新しいDeviseリソース(ユーザーなど)を作成するためのものであり:account_update、リソースを編集/更新するためのものです.

2 番目の引数に:keysは、許可するパラメーターの配列が含まれます。

必要に応じnested_attributesて、 に例があり:account_update、キーが である別の配列を入れます<object>_attributes

于 2016-06-12T22:54:51.287 に答える
16

@conciliator はマジック ワードが :account_update であることについては正しいですが、彼が言及したドキュメントへのリンクは次のとおりですhttp://rubydoc.info/github/plataformatec/devise/ 「devise_parameter_sanitizer」を検索すると、次のように表示されます。

Devise には、任意のパラメーター セットをモデルに渡すことができるアクションが 3 つしかないため、サニタイズが必要です。それらの名前とデフォルトで許可されているパラメーターは次のとおりです。

sign_in (Devise::SessionsController#new) - Permits only the authentication keys (like email)
sign_up (Devise::RegistrationsController#create) - Permits authentication keys plus password and password_confirmation
account_update (Devise::RegistrationsController#update) - Permits authentication keys plus password, password_confirmation and current_password
于 2014-04-18T17:20:25.937 に答える