Rails 4.1 accepted_nested_attributes_for和has_one与devise的关联

时间:2015-01-17 19:06:36

标签: ruby-on-rails ruby devise ruby-on-rails-4.1

我尝试使用Devise实现双重注册(用户可以是客户或提供商),但我无处可去(> _<)。

所以我有一个参数http://localhost:3000/users/sign_up?type=customerhttp://localhost:3000/users/sign_up?type=provider

的注册链接

我的问题是,如果我将:提供商的嵌套表单与我期望的<%= f.fields_for :provider do |fp| %>放在一起,因为它是 has_one 关联,它不是& #39;显示。如果我使用:提供商(例如<%= f.fields_for :providers do |fp| %>),则表单中的字段会正确显示,但不会保存。

我在其他帖子中尝试了一些建议的内容(例如thisthis),但似乎没有任何内容对我有用......

以下是我的代码的简化版本:

路线:

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

非常感谢!

1 个答案:

答案 0 :(得分:0)

当您使用fields_for :provider时,由于您尚未构建结果,因此未显示结果,请为嵌套属性构建关联。
当您使用fields_for :providers记录时,由于sign_up_params方法不是白名单providers属性,因此未保存记录。
如果您使用关联(嵌套属性),也在强参数中,那么您应该使用provider_attributes而不是提供者。