使用Devise添加额外的注册字段

我正在尝试为注册#new添加一些额外的字段。 由于我只需要额外的数据而且不需要不同的function,我不明白为什么我需要覆盖控制器等。所以我做的是修改注册#new如下:

在此处输入图像描述

要通过清理程序启用这些额外的字段,我更新了ApplicationController,如下所示:

在此处输入图像描述

由于某种原因,它不起作用,额外的字段作为空值进入数据库。

我使用的是Ruby 2和Rails 4 rc1,以及Devise 3.0.0.rc.

您的问题中的代码示例似乎无效,因为您没有设置before_filter来调用清理程序。

before_filter :configure_permitted_parameters, if: :devise_controller? 

话虽如此,最好覆盖控制器,如接受的答案中所示,以便应用程序控制器不会一直进行此检查。 接受的答案可以通过以下代码缩短。 我用我的应用程序测试了这段代码,效果很好。 所有这些都记录在3.0.0.rc标记的README的Strong Parameters部分中。

覆盖控制器:

 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" } 

好的,所以我做的只是覆盖Devise注册控制器,根据设计文档更新routes.rb以反映这一点,复制并粘贴注册的Devise代码#create as is,并更改获取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 

在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 

我有类似的情况(只是字段不同)。

以下是官方文档提供的方式:只需将其添加到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 

然后编辑config / initializers / devise.rb并进行更改

 # config.scoped_views = false 

 config.scoped_views = true 

这将允许您修改app / views / users / registration中的视图。

您将在此处添加此处所需的字段

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

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

现在我们必须处理rails mass assignment问题,转到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服务器并交叉手指。

截至2017年5月15日的Devise版本4.3.0,解决方案如下所示。 在这种情况下,正在添加用户名字段。

如果您想允许其他参数(lazy way™),您可以使用ApplicationController中的简单前置filter:

 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" %> 

第一:对于rails 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,那么在您的routes.rb中添加它是很重要的。

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

这确保了,从现在开始,该设计将采用您的新“注册”控制器(如果您决定拥有一个)。

我不知道“消毒剂”或这对什么有益。 但是我的应用程序可以正常使用我刚推荐给你的那些小改动。 您无需覆盖Controller! 覆盖视图就足够了。