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?
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"}
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.
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" %>
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"}
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!
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"}
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