Substituir criar controlador de registros

Eu adicionei um campo ao formulário de inscrição baseado em um modelo diferente, consulte Como eu uso os atributos nesteds com o modelo de desenvolvimento para os detalhes sangrentos. Esta parte está funcionando bem.

O problema agora é quando eu salvo, ele está falhando na ação de criação do controlador de registros que é fornecida pelo dispositivo com um Activerecord::UnknownAttributeError neste campo (empresa).

Eu estou supondo que eu preciso replace o controlador de registros, ou há uma maneira melhor / mais fácil eu deveria estar se aproximando disso?

    Em seu formulário, você está passando algum outro atributo, por meio de atribuição em massa, que não pertença ao seu modelo de usuário ou a algum dos modelos nesteds?

    Em caso afirmativo, acredito que o ActiveRecord :: UnknownAttributeError é acionado nesta instância.

    Caso contrário, acho que você pode criar seu próprio controlador, gerando algo assim:

     # 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 

    E então diga ao legado para usar esse controlador ao invés do padrão com:

     # app/config/routes.rb devise_for :users, :controllers => {:registrations => "registrations"} 

    Uma maneira melhor e mais organizada de replace os controladores e visões do Devise usando namespaces:

    Crie as seguintes pastas:

     app/controllers/my_devise app/views/my_devise 

    Coloque todos os controladores que você deseja replace em app / controllers / my_devise e adicione o namespace MyDevise aos nomes de classs do controlador. Exemplo de Registrations :

     # app/controllers/my_devise/registrations_controller.rb class MyDevise::RegistrationsController < Devise::RegistrationsController ... def create # add custom create logic here end ... end 

    Altere suas rotas de acordo:

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

    Copie todas as visualizações necessárias em app/views/my_devise partir da pasta gem do Devise ou use rails generate devise:views , exclua as visualizações que você não está sobrescrevendo e renomeie a pasta de my_devise para my_devise .

    Desta forma, você terá tudo organizado em duas pastas.

    Eu acredito que existe uma solução melhor do que rewrite o RegistrationsController. Eu fiz exatamente a mesma coisa (eu só tenho organização em vez de empresa).

    Se você definir corretamente seu formulário nested, no nível de modelo e visualização, tudo funcionará como um encanto.

    Meu modelo de usuário:

     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 

    Meu modelo de organização:

     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 

    Minha opinião: ‘devise / registrations / new.html.erb’

     

    Sign up

    < % 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! %>

    < %= f.label :name %>
    < %= f.text_field :name %>

    < %= f.label :email %>
    < %= f.text_field :email %>

    < %= f.label :username %>
    < %= f.text_field :username %>

    < %= f.label :password %>
    < %= f.password_field :password %>

    < %= f.label :password_confirmation %>
    < %= f.password_field :password_confirmation %>

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

    < %= organization_form.label :name %>
    < %= organization_form.text_field :name %>

    < %= organization_form.label :subdomain %>
    < %= organization_form.text_field :subdomain %>

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

    < %= f.submit "Sign up" %>

    < % end %> < %= render :partial => "devise/shared/links" %>

    Você pode gerar visualizações e controladores para planejar a personalização.

    Usar

     rails g devise:controllers users -c=registrations 

    e

     rails g devise:views 

    Ele copiará controladores e visualizações particulares da gem para o seu aplicativo.

    Em seguida, diga ao roteador para usar este controlador:

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

    Métodos muito simples Basta ir ao terminal e o tipo seguinte

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

    Próximo para usar exibições personalizadas

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

    agora no seu arquivo route.rb

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

    Você pode adicionar outros controladores também. Isso fará com que o uso de controladores na pasta de usuários e exibições na pasta de usuários.

    Agora você pode personalizar suas visualizações como desejar e adicionar sua lógica aos controladores na pasta controllers / users. Apreciar !

    crie os registros do controlador e substitua sua class herdada pela class predefinida Devise :: RegistrationsController

     # 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 

    depois disso, o roteamento segue para:

     # app/config/routes.rb devise_for :users, :controllers => {:registrations => "registrations"}