Rails 5, невизначений метод `for 'for # <Devise on line devise_parameter_sanitizer.for


95

Я працюю з 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

Під час реєстрації відображається помилка: невизначений метод `for 'для # Ви мали на увазі? вилка

Слід:

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)

Хто може допомогти? Як вирішити цю проблему?


1
Це трапляється і на Rails 4.2.
секрет

Відповіді:


173

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

чомусь це працює, але коли я перезапускаю рейки, він знову перестає працювати
K2xL

@ K2xL Очистити смітник? Ой, жовтень. Як ви це виправили?
snowYetis

зупинка + перезапуск весна, pehaps
phillyslick

1
Дякую! Для тих, хто не бажає оновлювати свій код, ви можете просто налаштувати свій Gemfile відповідно - gem 'devise', '~> 3'відсортував його для мене.
Дарра Енрайт,

34

Якщо ви просто зміните .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



0

Я думаю, що ви пропустили рахунок_оновлення в методі configure_permitted_parameters вашого контролера, вам потрібно слідувати шаблону розробляти. Devise має сторінку оновлення облікового запису. Ви можете знайти це в views / devise / registrations / edit.html.erb, і ваш код також не буде працювати на сторінці реєстрації, тут ви вказали сторінку реєстрації

Щоб оновити таблицю користувачів, щохвилини ви подаєте оновлення для своїх користувачів / редагування, або якщо ви подаєте ім’я користувача на сторінці реєстрації, вам потрібно дотримуватися цього шаблону розробляти, щоб оновити таблицю користувачів бази даних. Навіть якщо ви додали новий стовпець до таблиці користувачів, вам доведеться додати його до методу configure_permitted_parameters. У вашому випадку це ім’я користувача, але ви також пропустили оновлення account_update. Ви в основному говорите, що хочете оновити ім’я користувача або додати рядок до поля імені користувача, не дотримуючись шаблону Devise. Будь-яке поле, яке ви додаєте до таблиці Користувач, повинно слідувати цьому шаблону Devise. Також ви можете вказати, на якій сторінці дозволено оновлення цього імені користувача. У наведеному нижче прикладі я використовую сторінку оновлення пристрою. Так як я вже сказав, навіть якщо ви додали власне ім'я поля до таблиці Користувачі, вам потрібно дотримуватися цього шаблону.

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

-1
class ApplicationController < ActionController::Base

  before_action :configure_permitted_paramters, if: :devise_controller?

  protected
    def configure_permitted_paramters

        devise_parameter_sanitizer.permit(:sign_up, keys: [:fullname])

        devise_parameter_sanitizer.permit(:account_update, keys: [:fullname, 
        :phone_number, :description, :email, :password])

    end

end
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.