添加具有额外设计领域的注册(Adding extra registration fields wit

2019-09-02 10:43发布

我想一些额外的字段添加到注册#新。 因为我只想要额外的数据,并不需要不同的功能,我不明白为什么我需要重写控制器等,所以我所做的就是修改注册#新如下:

要通过消毒启用这些额外的字段,我更新的ApplicationController如下:

出于某种原因,它不工作和额外的领域去数据库为空值。

我使用的红宝石2和Rails 4 RC1,与设计3.0.0.rc.

Answer 1:

这样看来,在你的问题中的代码示例不工作,因为你没有设置的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" }


Answer 2:

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


Answer 3:

设计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


Answer 4:

由于设计版本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"  %>


Answer 5:

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

这里的方式官方文档可以提供:只需添加到您的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 (“强参数”)



Answer 6:

首先暴露的意见

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服务器和你的手指。



Answer 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(用新的行动和编辑)和自己的@variables然后在你的routes.rb中添加这是非常重要的

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

这保证,能想出把你的新的“注册”控制器从现在开始(如果你决定要一个)。

我不知道“消毒”或这是好事为了什么。 但是我的应用程序的工作原理只是我只是向你推荐这些细微的变化罚款。 你并不需要重写控制器! 重写次数只会是不够的。



文章来源: Adding extra registration fields with Devise