Anular el controlador de registros de dispositivos

Resuelto Craig McGuff asked hace 14 años • 6 respuestas

Agregué un campo al formulario de registro que se basa en un modelo diferente; consulte ¿Cómo uso atributos anidados con el modelo de diseño? para obtener detalles sangrientos. Esta parte está funcionando bien.

El problema ahora es que cuando guardo, falla la acción de creación del controlador de registros que proporciona el dispositivo con un Activerecord::UnknownAttributeErroren este campo (empresa).

Supongo que necesito anular el controlador de registros, ¿o hay una manera mejor o más fácil de abordar esto?

Craig McGuff avatar Aug 23 '10 16:08 Craig McGuff
Aceptado

En su formulario, ¿está pasando algún otro atributo, mediante asignación masiva, que no pertenezca a su modelo de usuario ni a ninguno de los modelos anidados?

Si es así, creo que ActiveRecord::UnknownAttributeError se activa en este caso.

De lo contrario, creo que puedes crear tu propio controlador generando algo como esto:

# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
  def new
    super
  end

  def create
    # add custom create logic here
  end

  def update
    super
  end
end 

Y luego dígale al dispositivo que use ese controlador en lugar del predeterminado con:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
theTRON avatar Aug 24 '2010 04:08 theTRON

Una forma mejor y más organizada de anular los controladores y vistas de Devise utilizando espacios de nombres:

Cree las siguientes carpetas:

app/controllers/my_devise
app/views/my_devise

Coloque todos los controladores que desee anular en app/controllers/my_devise y agregue MyDeviseespacio de nombres a los nombres de las clases de controladores. Registrationsejemplo:

# app/controllers/my_devise/registrations_controller.rb
class MyDevise::RegistrationsController < Devise::RegistrationsController

  ...

  def create
    # add custom create logic here
  end

  ...    

end 

Cambie sus rutas en consecuencia:

devise_for :users,
           :controllers  => {
             :registrations => 'my_devise/registrations',
             # ...
           }

Copie todas las vistas requeridas desde app/views/my_devisela carpeta de gemas de Devise o use rails generate devise:views, elimine las vistas que no está anulando y cambie el nombre devisede la carpeta my_devise.

De esta forma tendrás todo ordenado en dos carpetas.

Vincent avatar Mar 18 '2011 16:03 Vincent