我尝试使用Devise实现双重注册(用户可以是客户或提供商),但我无处可去(> _<)。
所以我有一个参数http://localhost:3000/users/sign_up?type=customer和http://localhost:3000/users/sign_up?type=provider
的注册链接我的问题是,如果我将:提供商的嵌套表单与我期望的<%= f.fields_for :provider do |fp| %>
放在一起,因为它是 has_one 关联,它不是& #39;显示。如果我使用:提供商(例如<%= f.fields_for :providers do |fp| %>
),则表单中的字段会正确显示,但不会保存。
我在其他帖子中尝试了一些建议的内容(例如this和this),但似乎没有任何内容对我有用......
以下是我的代码的简化版本:
路线:
Rails.application.routes.draw do
devise_for :users, :controllers => { registrations: 'registrations' }
resources :users
resources :customers
resources :providers
end
型号:
class User < ActiveRecord::Base
devise :database_authenticatable, :registerable,
:recoverable, :rememberable, :trackable, :validatable
has_one :customer
accepts_nested_attributes_for :customer
has_one :provider
accepts_nested_attributes_for :provider
end
class Customer < ActiveRecord::Base
belongs_to :user
end
class Provider < ActiveRecord::Base
belongs_to :user
end
控制器:
class RegistrationsController < Devise::RegistrationsController
def sign_up_params
params.require(resource_name).permit(:email, :password, :password_confirmation, customer: [:field_x], :provider: [:field_y]))
end
end
查看:
<h2>Sign up</h2>
<%= form_for(resource, as: resource_name, url: registration_path(resource_name)) do |f| %>
<%= devise_error_messages! %>
...
<% if params[:type] == "customer" %>
<%= f.fields_for :customers do |fc| %>
<div class="field">
<%= fc.label :field_x %><br />
<%= fc.text_field :field_x, autofocus: true %>
</div>
<% end %>
<% end %>
<% if params[:type] == "provider" %>
<%= f.fields_for :providers do |fp| %>
<div class="field">
<%= fp.label :field_y %><br />
<%= fp.text_field :field_y, autofocus: true %>
</div>
<% end %>
<% end %>
<div class="actions">
<%= f.submit "Sign up" %>
</div>
<% end %>
非常感谢!
答案 0 :(得分:0)
当您使用fields_for :provider
时,由于您尚未构建结果,因此未显示结果,请为嵌套属性构建关联。
当您使用fields_for :providers
记录时,由于sign_up_params
方法不是白名单providers
属性,因此未保存记录。
如果您使用关联(嵌套属性),也在强参数中,那么您应该使用provider_attributes
而不是提供者。