Rails 5, método indefinido `for 'para # <Devise on line devise_parameter_sanitizer.for


95

Estou trabalhando com Rails 5

Eu adicionei um novo nome de usuário de campo no modelo de usuário.

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

Durante o registro é exibido o erro: método indefinido `for 'para # Você quis dizer? garfo

Vestígio:

NoMethodError (método undefined `for 'para # Você quis dizer? 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)

Quem pode ajudar? Como resolver esse problema?


1
Isso também acontece no Rails 4.2.
sekrett

Respostas:


173

According to the documentation:

A API Parameter Sanitaizer mudou para o 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

por algum motivo isso funciona, mas quando eu reinicio o Rails, ele para de funcionar novamente
K2xL

@ K2xL Limpar seu lixo? Ops, é outubro. Como você consertou isso?
neveYetis

stop + restart spring, pehaps
phillyslick

1
Obrigado! Para aqueles que não desejam atualizar seu código, você pode apenas ajustar seu Gemfile de acordo - gem 'devise', '~> 3'ordenou-o para mim.
Darragh Enright

34

Se você apenas alterar o .forpara, .permitele também funcionará. Por exemplo:

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

Funciona tanto no Rails 4.2.x quanto no Rails 5.0.x


2

Não esqueça devise_parameter_sanitizer.permit(:account_update, keys: [:username])


1
Ele não se esqueceu, ele precisa mudar para uma nova sintaxe.
sekrett

0

Eu acho que você perdeu account_update no método configure_permitted_parameters do seu controlador, você precisa seguir o padrão de desenvolvimento. Devise tem uma página de atualização de conta. Você pode encontrar isso em views / devise / registrations / edit.html.erb, e seu código também não funcionará na página de inscrição, aqui você especificou a página de inscrição

Para atualizar sua tabela de usuário, no minuto em que você envia uma atualização em seus usuários / edição, ou se estiver enviando um nome de usuário na página de inscrição, você precisa seguir este padrão de planejamento para atualizar a tabela de usuário do banco de dados. Mesmo se você adicionou uma nova coluna à tabela do usuário, você teria que adicioná-la ao método configure_permitted_parameters. No seu caso, é nome de usuário, mas você perdeu account_update também. Você está basicamente dizendo que deseja atualizar o nome de usuário ou adicionar a string ao campo de nome de usuário sem seguir o padrão Devise. Qualquer campo que você adicionar à tabela User deve seguir este padrão do Devise. Além disso, você pode especificar qual página tem permissão para atualizar este nome de usuário. No meu exemplo abaixo, estou usando a página de atualização do devise. Então, como eu disse, mesmo se você adicionar um nome de campo personalizado à tabela Usuários, você precisa seguir esse padrão.

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

Em seguida, certifique-se em seu user.rb de validar o nome de usuário em seu modelo de usuário.

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
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.