web-dev-qa-db-ja.com

Rails 5、#<Devise on line devise_parameter_sanitizer.forの未定義メソッド「for」

Rails 5を使用しています

モデルUserの新しいフィールドユーザー名を追加しました。

class Users::RegistrationsController < Devise::RegistrationsController
  before_action :configure_permitted_parameters

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up).Push(:username)  
  end
end

登録中にエラーが表示されます:ndefined method `for 'for#意味ですか?fork

トレース:

NoMethodError(#の意味する未定義のメソッド `for 'ですか?fork):

app/controllers/users/registrations_controller.rb:7:in `configure_permitted_parameters'
  Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout
  Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb
  Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_source.html.erb (5.0ms)
  Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb
  Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_trace.html.erb (2.9ms)
  Rendering /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb
  Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/_request_and_response.html.erb (1.2ms)
  Rendered /usr/local/rvm/gems/Ruby-2.3.0/gems/actionpack-5.0.0.rc1/lib/action_dispatch/middleware/templates/rescues/diagnostics.html.erb within rescues/layout (118.1ms)

誰が助けることができますか?この問題をどのように解決しますか?

92
Dmitriy

According to the documentation:

パラメータサニタイザーAPIはDevise 4で変更されました

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
  end
end
166
Зелёный

.for.permitに変更するだけでも同様に機能します。例えば:

devise_parameter_sanitizer.permit(:sign_up) { |u| u.permit({ roles: [] }, :email, :password, :password_confirmation, :username) }

Rails 4.2.xとRails 5.0.xの両方で動作します

33
Brandy Burdick

devise_parameter_sanitizer.permit(:account_update, keys: [:username])を忘れないでください

2

コントローラーのconfigure_permitted_pa​​rametersメソッドでaccount_updateを見逃したと思います。deviseパターンに従う必要があります。deviseにはアカウント更新ページがあります。これはviews/devise/registrations/edit.html.erbにあり、コードはsign_upページでも機能しません。ここではsign_upページを指定しました

ユーザーテーブルを更新するには、users/editで更新を送信するか、sign_upページでユーザー名を送信する場合、この工夫パターンに従ってデータベースのUserテーブルを更新する必要があります。ユーザーテーブルに新しい列を追加した場合でも、configure_permitted_pa​​rametersメソッドに追加する必要があります。あなたの場合、それはユーザー名ですが、account_updateも見逃しています。基本的に、Deviseパターンに従わずにユーザー名を更新するか、ユーザー名フィールドに文字列を追加することを言っています。 Userテーブルに追加するフィールドは、このDeviseパターンに従う必要があります。また、このユーザー名の更新を許可するページを指定できます。以下の私の例では、devise updateページを使用しています。先ほど言ったように、Usersテーブルにカスタムフィールド名を追加した場合でも、このパターンに従う必要があります。ユーザー名を追加する必要がある別のページがある場合は、同じことをするだけです。

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

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    devise_parameter_sanitizer.permit(:account_update, keys: [:username])
  end
end

次に、user.rbで、ユーザーモデルのユーザー名を検証していることを確認してください。

class User < ApplicationRecord
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :validatable

  validates :username, presence: true
end
0
Elias Glyptis