Invalidar el controlador de registros de devise


He agregado un campo al formulario de registro que se basa en un modelo diferente, vea Cómo uso atributos anidados con el modelo devise para los detalles sangrientos. Esta parte está funcionando bien.

El problema ahora es que cuando guardo, está fallando en la acción create del controlador de registros que proporciona devise con un Activerecord::UnknownAttributeError en este campo (compañía).

Estoy asumiendo que necesito anular el controlador de registros, o hay una manera mejor / más fácil que debería ser ¿acercándote a esto?

Author: Community, 2010-08-23

6 answers

En su formulario está pasando cualquier otro atributo, a través de asignación masiva que no pertenezca a su modelo de usuario, o cualquiera de los modelos anidados?

Si es así, creo que el ActiveRecord::UnknownAttributeError se activa en esta instancia.

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 dile a devise que use ese controlador en lugar del predeterminado con:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
 339
Author: theTRON,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-10-18 01:29:37

Una forma mejor y más organizada de sobreescribir controladores y vistas de Devise usando espacios de nombres:

Cree las siguientes carpetas:

app/controllers/my_devise
app/views/my_devise

Coloque todos los controladores que desee sobreescribir en app/controllers/my_devise y agregue MyDevise espacio de nombres a los nombres de clase de controlador. Registrations ejemplo:

# 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 en app/views/my_devise desde la carpeta Devise gem o use rails generate devise:views, elimine las vistas que no está sobreescribiendo y cambie el nombre devise carpeta a my_devise.

De esta manera tendrás todo organizado en dos carpetas.

 64
Author: Vincent,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-03-18 18:38:25

Creo que hay una mejor solución que reescribir el RegistrationsController. Hice exactamente lo mismo (solo tengo Organización en lugar de Compañía).

Si configura correctamente su formulario anidado, a nivel de modelo y vista, todo funciona como un encanto.

Mi modelo de usuario:

class User < ActiveRecord::Base
  # Include default devise modules. Others available are:
  # :token_authenticatable, :confirmable, :lockable and :timeoutable
  devise :database_authenticatable, :registerable,
     :recoverable, :rememberable, :trackable, :validatable

  has_many :owned_organizations, :class_name => 'Organization', :foreign_key => :owner_id

  has_many :organization_memberships
  has_many :organizations, :through => :organization_memberships

  # Setup accessible (or protected) attributes for your model
  attr_accessible :email, :password, :password_confirmation, :remember_me, :name, :username, :owned_organizations_attributes

  accepts_nested_attributes_for :owned_organizations
  ...
end

Mi Modelo de Organización:

class Organization < ActiveRecord::Base
  belongs_to :owner, :class_name => 'User'
  has_many :organization_memberships
  has_many :users, :through => :organization_memberships
  has_many :contracts

  attr_accessor :plan_name

  after_create :set_owner_membership, :set_contract
  ...
end

Mi punto de vista : 'devise/registrations/new.HTML.erb "

<h2>Sign up</h2>

<% resource.owned_organizations.build if resource.owned_organizations.empty? %>
<%= form_for(resource, :as => resource_name, :url => registration_path(resource_name)) do |f| %>
  <%= devise_error_messages! %>

  <p><%= f.label :name %><br />
    <%= f.text_field :name %></p>

  <p><%= f.label :email %><br />
    <%= f.text_field :email %></p>

  <p><%= f.label :username %><br />
    <%= f.text_field :username %></p>

  <p><%= f.label :password %><br />
    <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
    <%= f.password_field :password_confirmation %></p>

  <%= f.fields_for :owned_organizations do |organization_form| %>

    <p><%= organization_form.label :name %><br />
      <%= organization_form.text_field :name %></p>

    <p><%= organization_form.label :subdomain %><br />
      <%= organization_form.text_field :subdomain %></p>

    <%= organization_form.hidden_field :plan_name, :value => params[:plan] %>

  <% end %>

  <p><%= f.submit "Sign up" %></p>
<% end %>

<%= render :partial => "devise/shared/links" %>
 33
Author: thb,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-12-24 15:28:51

Puede generar vistas y controladores para la personalización del dispositivo.

Use

rails g devise:controllers users -c=registrations

Y

rails g devise:views 

Copiará controladores y vistas particulares de gem a su aplicación.

Luego, dile al router que use este controlador:

devise_for :users, :controllers => {:registrations => "users/registrations"}
 10
Author: user1201917,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-03-06 13:36:06

Métodos Muy simples Solo tienes que ir a la terminal y el tipo siguiente

rails g devise:controllers users //This will create devise controllers in controllers/users folder

Junto a usar vistas personalizadas

rails g devise:views users //This will create devise views in views/users folder

Ahora en su ruta.rb file

devise_for :users, controllers: {
           :sessions => "users/sessions",
           :registrations => "users/registrations" }

También puede agregar otros controladores. Esto hará que devise use controladores en la carpeta usuarios y vistas en la carpeta usuarios.

Ahora puede personalizar sus vistas como desee y agregar su lógica a los controladores en la carpeta controllers/users. ¡Que lo disfrutes!

 10
Author: Pradeep Sapkota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-22 01:48:52

Cree los registros del controlador y anule su clase heredada por Devise predefinido::RegistrationsController class

# 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 

Después de esto establecer rutas a:

# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
 0
Author: Jai Kumar Rajput,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-12-21 12:05:44