我想一些额外的字段添加到注册#新。 因为我只想要额外的数据,并不需要不同的功能,我不明白为什么我需要重写控制器等,所以我所做的就是修改注册#新如下:
要通过消毒启用这些额外的字段,我更新的ApplicationController如下:
出于某种原因,它不工作和额外的领域去数据库为空值。
我使用的红宝石2和Rails 4 RC1,与设计3.0.0.rc.
我想一些额外的字段添加到注册#新。 因为我只想要额外的数据,并不需要不同的功能,我不明白为什么我需要重写控制器等,所以我所做的就是修改注册#新如下:
要通过消毒启用这些额外的字段,我更新的ApplicationController如下:
出于某种原因,它不工作和额外的领域去数据库为空值。
我使用的红宝石2和Rails 4 RC1,与设计3.0.0.rc.
这样看来,在你的问题中的代码示例不工作,因为你没有设置的before_filter调用液。
before_filter :configure_permitted_parameters, if: :devise_controller?
随着中说,它可能会更好重写控制器,如图接受的答案,从而使应用程序控制器是不是做这个检查所有的时间。 该接受的答案可以用下面的代码被缩短了。 我已经测试此代码与我的应用程序,它工作得很好。 所有这一切都在的强大的参数部分被记录自述在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" }
OK,所以我做了什么只是覆盖设计登记控制器,更新的routes.rb按照该色器件文档反映此事,复制和粘贴的注册#为的是创造的设计代码,并更改越来越PARAMS部分使用自己强参数的方法,和就是这样。
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
设计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.3.0,2017年5月15日,该解决方案是从文档如下。 在这种情况下,被添加的用户名字段。
如果你想允许其他参数(偷懒的方法™),你可以做你的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
然后添加必要的字段成注册#新观点
<%= f.text_field :username, placeholder: "Username" %>
我有类似的情况(只是场是不同的)。
这里的方式官方文档可以提供:只需添加到您的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 (“强参数”)
首先暴露的意见
rails generate devise:views users
然后编辑配置/初始化/ 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
重新启动您的Web服务器和你的手指。
首先:没有一个新的“强劲的参数”与轨道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(用新的行动和编辑)和自己的@variables然后在你的routes.rb中添加这是非常重要的
devise_for :users, :controllers => { :registrations => 'registrations' }
resources :users
这保证,能想出把你的新的“注册”控制器从现在开始(如果你决定要一个)。
我不知道“消毒”或这是好事为了什么。 但是我的应用程序的工作原理只是我只是向你推荐这些细微的变化罚款。 你并不需要重写控制器! 重写次数只会是不够的。