如何编写参数清理器方法来清理设计 sign_up 操作中其他模型的参数?
how to write parameter sanitiser method to sanitize the parameters of other model in devise sign_up action?
我有两张表 employee 和 company。我想在员工注册时使用 devise sign_up 操作注册员工的公司名称。如何编写设计参数sanitiser方法以在员工注册时保存公司名称?
用于在 sign_up 表单中添加自定义信息试试这个:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit( :company_name, :email,:password, :password_confirmation ) }
end
end
并更改您的 views/devise/registrations/new.html.erb.
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="field">
<%= f.label :company_name %><br />
<%= f.text_field :company_name %>
</div>
<% end %>
诀窍是使用 accepts_nested_attributes_for 并覆盖注册控制器上的 sign_up_params
方法。
1。设置用户模型以接受公司的属性
class User < ActiveRecord::Base
belongs_to :company
accepts_nested_attributes_for :company
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
2。覆盖默认注册控制器
# config/routes.rb
Rails.application.routes.draw do
# ...
devise_for :users, controllers: { registrations: "registrations" }
end
# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
# GET /users/sign_up
def new
@user = User.new(company: Company.new)
end
def sign_up_params
params.require(:user).permit(
:email, :password, :password_confirmation,
company_attributes: [:name]
)
end
end
通过深入研究 source of Devise::RegistrationsController
,我们可以发现它调用了 build_resource(sign_up_params)
,这大约等同于 User.new(sign_up_params)
。所以我们可以通过声明我们自己的 sign_up_params
方法来简单地添加我们自己的参数处理。
请注意,在 sign_up_params
中,我们使用内置的 Rails 4 强参数处理,而不是 Devise sanitized params,这是一个早于 Rails 4 的家庭解决方案。它可能是可以使用 Devise sanitized params 来做到这一点,但没有真正的理由,除非你必须向后兼容 Rails 3.
3。自定义注册表单
为了获得正确的参数散列,我们希望输入的公司名称具有以下 name
属性:
user[company_attributes][name]
Rails 有一个名为 fields_for
的好帮手,它让我们可以做到这一点:
<%# app/views/devise/registrations/new.html.erb %>
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>
<fieldset>
<legend>Company</legend>
<%= f.fields_for :company do |c| %>
<div class="field">
<%= c.label :name %><br />
<%= c.text_field :name%>
</div>
<% end %>
</fieldset>
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
请注意,fields_for
在我们创建嵌套输入的块 (c
) 中为我们提供了一个新的表单生成器实例。
4。啤酒。
我有两张表 employee 和 company。我想在员工注册时使用 devise sign_up 操作注册员工的公司名称。如何编写设计参数sanitiser方法以在员工注册时保存公司名称?
用于在 sign_up 表单中添加自定义信息试试这个:
class ApplicationController < ActionController::Base
protect_from_forgery with: :exception
before_action :configure_permitted_parameters, if: :devise_controller?
protected
def configure_permitted_parameters
devise_parameter_sanitizer.for(:sign_up) { |u| u.permit( :company_name, :email,:password, :password_confirmation ) }
end
end
并更改您的 views/devise/registrations/new.html.erb.
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="field">
<%= f.label :company_name %><br />
<%= f.text_field :company_name %>
</div>
<% end %>
诀窍是使用 accepts_nested_attributes_for 并覆盖注册控制器上的 sign_up_params
方法。
1。设置用户模型以接受公司的属性
class User < ActiveRecord::Base
belongs_to :company
accepts_nested_attributes_for :company
# Include default devise modules. Others available are:
# :confirmable, :lockable, :timeoutable and :omniauthable
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
end
2。覆盖默认注册控制器
# config/routes.rb
Rails.application.routes.draw do
# ...
devise_for :users, controllers: { registrations: "registrations" }
end
# app/controllers/registrations_controller.rb
class RegistrationsController < Devise::RegistrationsController
# GET /users/sign_up
def new
@user = User.new(company: Company.new)
end
def sign_up_params
params.require(:user).permit(
:email, :password, :password_confirmation,
company_attributes: [:name]
)
end
end
通过深入研究 source of Devise::RegistrationsController
,我们可以发现它调用了 build_resource(sign_up_params)
,这大约等同于 User.new(sign_up_params)
。所以我们可以通过声明我们自己的 sign_up_params
方法来简单地添加我们自己的参数处理。
请注意,在 sign_up_params
中,我们使用内置的 Rails 4 强参数处理,而不是 Devise sanitized params,这是一个早于 Rails 4 的家庭解决方案。它可能是可以使用 Devise sanitized params 来做到这一点,但没有真正的理由,除非你必须向后兼容 Rails 3.
3。自定义注册表单
为了获得正确的参数散列,我们希望输入的公司名称具有以下 name
属性:
user[company_attributes][name]
Rails 有一个名为 fields_for
的好帮手,它让我们可以做到这一点:
<%# app/views/devise/registrations/new.html.erb %>
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
<div class="field">
<%= f.label :email %><br />
<%= f.email_field :email, autofocus: true %>
</div>
<div class="field">
<%= f.label :password %>
<% if @minimum_password_length %>
<em>(<%= @minimum_password_length %> characters minimum)</em>
<% end %><br />
<%= f.password_field :password, autocomplete: "off" %>
</div>
<div class="field">
<%= f.label :password_confirmation %><br />
<%= f.password_field :password_confirmation, autocomplete: "off" %>
</div>
<fieldset>
<legend>Company</legend>
<%= f.fields_for :company do |c| %>
<div class="field">
<%= c.label :name %><br />
<%= c.text_field :name%>
</div>
<% end %>
</fieldset>
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
<%= render "devise/shared/links" %>
请注意,fields_for
在我们创建嵌套输入的块 (c
) 中为我们提供了一个新的表单生成器实例。