ruby on rails - not - Anular controlador de registro de dispositivos
devise rails español (6)
Creo que hay una solución mejor que volver a escribir el RegistrationsController. Hice exactamente lo mismo (solo tengo Organización en lugar de Empresa).
Si configura correctamente su forma anidada, a nivel de modelo y vista, todo funciona a la perfección.
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" %>
Agregué un campo al formulario de registro que se basa en un modelo diferente, vea ¿Cómo uso los atributos anidados con el modelo de dispositivo para los detalles escabros? Esta parte está funcionando bien.
El problema ahora es cuando guardo, está fallando en la acción de creación del controlador de registros que proporciona el Activerecord::UnknownAttributeError
con un Activerecord::UnknownAttributeError
en este campo (empresa).
Supongo que necesito anular el controlador de registros, o ¿hay alguna forma mejor / más fácil en la que deba acercarme a esto?
En su formulario, ¿está pasando algún otro atributo, a través de una asignación en masa que no pertenezca a su modelo de usuario, o cualquiera de los modelos anidados?
Si es así, creo que 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 al dispositivo que use ese controlador en lugar del predeterminado con:
# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}
Métodos muy simples. Solo ve a la terminal y el siguiente tipo.
rails g devise:controllers users //This will create devise controllers in controllers/users folder
Siguiente para usar vistas personalizadas
rails g devise:views users //This will create devise views in views/users folder
ahora en tu archivo route.rb
devise_for :users, controllers: {
:sessions => "users/sessions",
:registrations => "users/registrations" }
Usted puede agregar otros controladores también. Esto hará que el dispositivo utilice los controladores en la carpeta de usuarios y las vistas en la carpeta de usuarios.
Ahora puede personalizar sus vistas como desee y agregar su lógica a los controladores en la carpeta de controladores / usuarios. Disfrutar
Puede generar vistas y controladores para la personalización del dispositivo.
Utilizar
rails g devise:controllers users -c=registrations
y
rails g devise:views
Copiará controladores y vistas particulares de gemas a su aplicación.
A continuación, dile al enrutador que use este controlador:
devise_for :users, :controllers => {:registrations => "users/registrations"}
Una forma mejor y más organizada de anular los controladores y vistas de Devise utilizando espacios de nombres:
Crea las siguientes carpetas:
app/controllers/my_devise
app/views/my_devise
Coloque todos los controladores que desee reemplazar en app / controllers / my_devise y agregue el espacio de nombres MyDevise
nombres de clase del controlador. Ejemplo de Registrations
:
# app/controllers/my_devise/registrations_controller.rb
class MyDevise::RegistrationsController < Devise::RegistrationsController
...
def create
# add custom create logic here
end
...
end
Cambia tus rutas en consecuencia:
devise_for :users,
:controllers => {
:registrations => ''my_devise/registrations'',
# ...
}
Copie todas las vistas requeridas en la app/views/my_devise
desde la carpeta de gemas Devise o use los rails generate devise:views
app/views/my_devise
rails generate devise:views
, elimine las vistas que no está anulando y cambie el nombre de la carpeta del my_devise
a my_devise
.
De esta manera tendrás todo perfectamente organizado en dos carpetas.
cree los registros del controlador y anule su clase heredada por la clase Devise :: RegistrationsController predefinida
# 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 se establecen rutas para:
# app/config/routes.rb
devise_for :users, :controllers => {:registrations => "registrations"}