Добавление дополнительных полей регистрации с помощью приложения
Я пытаюсь добавить несколько дополнительных полей в регистрацию # 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
Это гарантирует, что разработчик будет принимать ваш новый контроллер регистрации с этого момента (если вы решили его иметь).
Я не знаю "дезинфицирующего средства" или для чего это полезно. Но мое приложение прекрасно работает с теми незначительными изменениями, которые я вам только что рекомендовал. Вам не нужно переопределять контроллер! Переопределение просмотров будет достаточно.