Добавление дополнительных полей регистрации с помощью приложения

Я пытаюсь добавить несколько дополнительных полей в регистрацию # new. Поскольку мне нужны только дополнительные данные и мне не нужны другие функции, я не понимаю, почему мне нужно переопределять контроллеры и т.д. Поэтому я изменил регистрацию # new следующим образом:

%h2
  Sign up
= form_for(resource, as: resource_name, url: registration_path(resource_name)) do ||f
  = devise_error_messages!
  %div
    = f.label :email
    %br
    = f.email_field :email, autofocus: true
  %div
    = f.label :title_id
    %br
    = f.text_field :title_id
  %div
    = f.label :province_id
    %br
    = f.text_field :province_id
  %div
    = f.label :first_name
    %br
    = f.text_field :first_name
  %div
    = f.label :last_name
    %br
    = f.text_field :last_name
  %div
    = f.label :password
    %br
    = f.password_field :password
  %div
    = f.label :password_confirmation
    %br
    = f.password_field :password_confirmation
  %div= f.submit 'Sign up'
= render 'devise/shared/links'

Чтобы включить эти дополнительные поля с помощью дезинфицирующего средства, я обновил ApplicationController следующим образом:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception
  before_filter :store_requested_url!
  # before_filter :authenticate_user!

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_in) { |u| u.permit(:email) }
    devise_parameter_sanitizer.for(:sign_up) { |u| u.permit(:email, :password, :password_confirmation, :title_id, :province_id, :first_name, :last_name) }
    devise_parameter_sanitizer.for(:account_update) { |u| u.permit(:email, :password, :password_confirmation, :current_password) }
  end

  def after_sign_in_path_for(resource)
    session[:requested_url] || root_path
  end

  private

  def store_requested_url
    # store last url as long as it isn't a /users path
    session[:previous_url] = request.fullpath unless request.fullpath == /\/users/
  end
end

По какой-то причине это не работает, и дополнительные поля попадают в базу данных как нули.

Я использую Ruby 2 и Rails 4 rc1, с Devise 3.0.0.rc.

Ответ 1

ОК, поэтому я просто переопределил контроллер регистрации Devise, обновил route.rb в соответствии с разработанными документами, чтобы отразить это, скопировал и вставил код разработчика для регистрации # create as is и изменил параметр получения параметров на используйте мой собственный метод сильных параметров, и именно это.

class RegistrationsController < Devise::RegistrationsController

  def create
    build_resource(registration_params)

    if resource.save
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_navigational_format?
        sign_up(resource_name, resource)
        respond_with resource, :location => after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_navigational_format?
        respond_with resource, :location => after_sign_up_path_for(resource)
      end
    else
      clean_up_passwords
      respond_with resource
    end
  end  

  private

  def registration_params
    params.require(:user).permit(:email, :title_id, :first_name, :last_name, 
      :province_id, :password, :password_confirmation)
  end

end

Ответ 2

Похоже, что образец кода в вашем вопросе не работает, потому что вы не устанавливаете before_filter для вызова дезинфицирующего средства.

before_filter :configure_permitted_parameters, if: :devise_controller?

С учетом сказанного, вероятно, лучше переопределить контроллер, как показано в принятом ответе, чтобы контроллер приложения не выполнял эту проверку все время. Принятый ответ можно сократить с помощью кода ниже. Я тестировал этот код с моим приложением, и он работает хорошо. Все это описано в разделе "Сильные параметры" README в теге 3.0.0.rc.

Переопределить контроллер:

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

Затем обновите маршруты для его использования:

devise_for :members, :controllers => { :registrations => "registrations" }

Ответ 3

После Devise 4.0 старые ответы на эту тему недействительны. вместо метода for вы должны использовать:

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

Итак, для полного решения в 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

Ответ 4

Начиная с версии 4.0.0, 15 мая 2017 года, решение из документации выглядит следующим образом. В этом случае добавляется поле имени пользователя.

Если вы хотите разрешить дополнительные параметры (lazy way ™), вы можете сделать это, используя простой фильтр перед вашим фильтром 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

И, конечно, просто добавьте поле в свою базу данных

> 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

Затем добавьте необходимые поля в представление для регистрации # new

<%= f.text_field :username, placeholder: "Username"  %>

Ответ 5

Сначала выведите представления

rails generate devise:views users

затем отредактируйте config/initializers/devise.rb и измените

# config.scoped_views = false

к

config.scoped_views = true

это позволит вам изменять представления в приложениях/представлениях/пользователях/регистрации.

вы добавите нужные поля, как в

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

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

Теперь нам приходится иметь дело с проблемой массового присвоения рельсов, перейти к application_controller.rb и добавить before_filter

before_filter :configure_permitted_parameters, if: :devise_controller?

затем добавьте свои поля + исходные поля для разработки санитарии

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

перезапустите веб-сервер и скрестите пальцы.

Ответ 6

У меня была схожая ситуация (только поля были разные).

Здесь можно предложить официальную документацию: Просто добавьте это в свой ApplicationController. И измените "имя пользователя" на все, что вам нужно, и добавьте еще немного, если вам нужно.

before_action :configure_permitted_parameters, if: :devise_controller?

  protected

  def configure_permitted_parameters
    devise_parameter_sanitizer.for(:sign_up) << :username
  end

Мой контроллер приложений выглядит следующим образом:

class ApplicationController < ActionController::Base
  # Prevent CSRF attacks by raising an exception.
  # For APIs, you may want to use :null_session instead.
  protect_from_forgery with: :exception

  before_action :configure_permitted_parameters, if: :devise_controller?

  protected

    def configure_permitted_parameters
      devise_parameter_sanitizer.for(:sign_up) << :public_name
    end
end

Подробнее здесь: https://github.com/plataformatec/devise ( "Сильные параметры" )

Ответ 7

Во-первых: не возникает ли проблема с "сильными параметрами" с рельсами 4, вы можете также изучить это.

Если вы переносите новые параметры в свою модель пользователя. Тогда все, что вам нужно сделать, это переопределить (создать) файлы:

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

вы можете посмотреть здесь файлы по умолчанию: https://github.com/plataformatec/devise/tree/master/app/views/devise/registrations

ЕСЛИ вы можете реализовать собственный registrations_controller.rb(с действиями new и edit) и вашими собственными @variables, тогда важно добавить это в ваши маршруты .rb

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

Это гарантирует, что разработчик будет принимать ваш новый контроллер регистрации с этого момента (если вы решили его иметь).

Я не знаю "дезинфицирующего средства" или для чего это полезно. Но мое приложение прекрасно работает с теми незначительными изменениями, которые я вам только что рекомендовал. Вам не нужно переопределять контроллер! Переопределение просмотров будет достаточно.