Rails 5, Неопределенный метод `for 'для # <Разработка в строке 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

Во время регистрации отображается ошибка: undefined method `for '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.
sekrett

Ответы:

173

According to the documentation:

API-интерфейс Parameter Sanitaizer был изменен для 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
стоп + перезапуск, пружина, возможно
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

Бренди Бердик
источник
2

Не забывай devise_parameter_sanitizer.permit(:account_update, keys: [:username])

Дмитрий Поляковский
источник
1
Он не забыл, ему нужно перейти на новый синтаксис.
sekrett
0

Я думаю, вы пропустили account_update в методе configure_permitted_parameters вашего контроллера, вам нужно следовать шаблону разработки. У Devise есть страница обновления учетной записи. Вы можете найти это в views / devise / registrations / edit.html.erb, и ваш код также не будет работать на странице sign_up, здесь вы указали страницу sign_up

Чтобы обновить свою таблицу пользователей, в ту минуту, когда вы отправляете обновление в своих пользователях / редактировании, или если вы отправляете имя пользователя на странице регистрации, вам необходимо следовать этому шаблону разработки, чтобы обновить таблицу пользователей базы данных. Даже если вы добавили новый столбец в пользовательскую таблицу, вам придется добавить его в метод configure_permitted_parameters. В вашем случае это имя пользователя, но вы также пропустили account_update. Вы в основном говорите, что хотите обновить имя пользователя или добавить строку в поле имени пользователя, не следуя шаблону Devise. Любое поле, которое вы добавляете в таблицу User, должно соответствовать этому шаблону Devise. Также вы можете указать, какой странице разрешено обновлять это имя пользователя. В моем примере ниже я использую страницу обновления устройства. Итак, как я уже сказал, даже если вы добавили настраиваемое имя поля в таблицу 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 вы проверили имя пользователя в своей модели User.

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
Элиас Глиптис
источник