Adding extra registration fields with Devise

前端 未结 8 580
情话喂你
情话喂你 2020-12-01 06:57

I am trying to add some extra fields to registrations#new. Since I only want extra data and do not need different functionality, I don\'t see why I need to override controll

相关标签:
8条回答
  • 2020-12-01 07:11

    As of Devise version 4.3.0, May 15th 2017, the solution is as follows from the documentation. In this case, the username field is being added.

    In case you want to permit additional parameters (the lazy way™), you can do so using a simple before filter in your ApplicationController:

    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      protected
    
      def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
      end
    end
    

    And of course, simply add the field to your database

    > rails g migration AddUsernameToUsers
    
    class AddUsernameToUsers < ActiveRecord::Migration[5.0]
      def change
        add_column :users, :username, :string, null: false, index: true, unique: true
      end
    end
    

    And then add the necessary fields into the view for registrations#new

    <%= f.text_field :username, placeholder: "Username"  %>
    
    0 讨论(0)
  • 2020-12-01 07:12

    It would appear that the code sample in your question is not working because you are not setting the before_filter to call the sanitizer.

    before_filter :configure_permitted_parameters, if: :devise_controller?
    

    With that said, it's probably better to override the controller, as shown in the accepted answer, so that the application controller isn't doing this check all of the time. The accepted answer can be shortened up with the code below. I've tested this code with my application and it works well. All of this is documented in the Strong Parameters section of the README in the 3.0.0.rc tag.

    Override the controller:

    class RegistrationsController < Devise::RegistrationsController
      before_filter :configure_permitted_parameters, :only => [:create]
    
      protected
    
        def configure_permitted_parameters
          devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) }
        end
    end
    

    Then update the routes to use it:

    devise_for :members, :controllers => { :registrations => "registrations" }
    
    0 讨论(0)
  • 2020-12-01 07:16

    First: Isn't there a new 'strong parameters' issue with rails 4, you might want to look into this as well.

    If you migrate the new parameters into your User model. Then all you have to do is to override (create) the files:

    app/views/devise/registrations/edit.html.erb
    app/views/devise/registrations/new.html.erb
    

    you can look at the default files here: https://github.com/plataformatec/devise/tree/master/app/views/devise/registrations

    IF you might want to implement an own registrations_controller.rb (with actions new and edit) and your own @variables then it is important to add this in your routes.rb

    devise_for :users, :controllers => { :registrations => 'registrations' }
    resources :users
    

    This ensures, that devise takes your new 'registrations' controller from now on (if you decided to have one).

    I don't know "sanitizer" or what this is good for. But my App works just fine with those minor changes I just recommended to you. You don't need to override the Controller! Overriding the Views will just be enough.

    0 讨论(0)
  • 2020-12-01 07:21

    First expose the views

    rails generate devise:views users
    

    then edit config/initializers/devise.rb and change

    # config.scoped_views = false
    

    to

    config.scoped_views = true
    

    this will allow you to modify the views at app/views/users/registration.

    you will add the fields needed here, in both

    app/views/users/registration/edit.html.erb

    app/views/users/registration/new.html.erb
    

    Now we have to deal with rails mass assignment issue, go to application_controller.rb and add a before_filter

    before_filter :configure_permitted_parameters, if: :devise_controller?
    

    then add your fields + original fields to devise sanitization

    protected
    
        def configure_permitted_parameters
            # Fields for sign up
            devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:username, :email, :password) }
            # Fields for editing an existing account
            devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:username, :email, :password, :current_password, :gender) }
        end
    

    restart your web server and cross your fingers.

    0 讨论(0)
  • 2020-12-01 07:21

    New fields could be added like this example. For Devise 4, the Parameter Sanitaizer API has changed:

    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      protected
    
      def configure_permitted_parameters
        devise_parameter_sanitizer.permit(:sign_up, keys: [:username, :name])
      end
    end
    
    0 讨论(0)
  • 2020-12-01 07:25

    After Devise 4.0 the older answers on this topic are not valid. instead of the for method you have to use:

    devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
    

    So, for a complete solution in ApplicationController:

    class ApplicationController < ActionController::Base
      before_action :configure_permitted_parameters, if: :devise_controller?
    
      protected
        def configure_permitted_parameters
           devise_parameter_sanitizer.permit(:sign_up, keys: [:username])
        end
    end
    
    0 讨论(0)
提交回复
热议问题