使用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! 覆盖视图就足够了。
- 调用Rails.application.routes.generate()或Rails.application.routes.recognize_path()时出现’RuntimeError:route set not finalized’
- 在ApplicationController中覆盖current_user会引发未定义的方法错误
- Devies – 登录后使用’POST’请求路由到行动
- Rails:更改生产数据库的最佳方式
- 如何从rails模型生成plist?
- Travis-CI上的Rails数据库设置
- carrierwave:thumb错误的参数数量
- 在Rails中无缝部署
- Omniauth与FourSquare问题