Override devise registrations controller

前端 未结 5 1727
渐次进展
渐次进展 2020-11-22 00:05

I have added a field to the sign-up form that is based on a different model, see How do I use nested attributes with the devise model for the gory details. This part is work

相关标签:
5条回答
  • 2020-11-22 00:49

    A better and more organized way of overriding Devise controllers and views using namespaces:

    Create the following folders:

    app/controllers/my_devise
    app/views/my_devise
    

    Put all controllers that you want to override into app/controllers/my_devise and add MyDevise namespace to controller class names. Registrations example:

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

    Change your routes accordingly:

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

    Copy all required views into app/views/my_devise from Devise gem folder or use rails generate devise:views, delete the views you are not overriding and rename devise folder to my_devise.

    This way you will have everything neatly organized in two folders.

    0 讨论(0)
  • 2020-11-22 00:51

    I believe there is a better solution than rewrite the RegistrationsController. I did exactly the same thing (I just have Organization instead of Company).

    If you set properly your nested form, at model and view level, everything works like a charm.

    My User model:

    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
    

    My Organization Model:

    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
    

    My view : '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" %>
    
    0 讨论(0)
  • 2020-11-22 00:52

    You can generate views and controllers for devise customization.

    Use

    rails g devise:controllers users -c=registrations
    

    and

    rails g devise:views 
    

    It will copy particular controllers and views from gem to your application.

    Next, tell the router to use this controller:

    devise_for :users, :controllers => {:registrations => "users/registrations"}
    
    0 讨论(0)
  • Very simple methods Just go to the terminal and the type following

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

    Next to use custom views

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

    now in your route.rb file

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

    You can add other controllers too. This will make devise to use controllers in users folder and views in users folder.

    Now you can customize your views as your desire and add your logic to controllers in controllers/users folder. Enjoy !

    0 讨论(0)
  • 2020-11-22 01:09

    In your form are you passing in any other attributes, via mass assignment that don't belong to your user model, or any of the nested models?

    If so, I believe the ActiveRecord::UnknownAttributeError is triggered in this instance.

    Otherwise, I think you can just create your own controller, by generating something like this:

    # 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 
    

    And then tell devise to use that controller instead of the default with:

    # app/config/routes.rb
    devise_for :users, :controllers => {:registrations => "registrations"}
    
    0 讨论(0)
提交回复
热议问题