8

我已经搜索了大约一个小时,发现了大量描述如何向 Devise 用户模型添加字段的问题。但是,我找不到任何可以清楚地解释如何将一个或多个模型添加到注册过程的方法。

在注册时,我希望用户填写电子邮件地址、密码以及我的客户模型、公司模型和地址模型(这样我就拥有了 web 应用程序正常运行所需的所有信息)。

我的模型是这样的

用户.rb

class User < ActiveRecord::Base
  devise :database_authenticatable, :registerable,
         :recoverable, :rememberable, :trackable, :validatable

  attr_accessible :email, :password, :password_confirmation, :remember_me, :client

  belongs_to :client
end

客户端.rb

class Client < ActiveRecord::Base
  attr_accessible :bankaccount, :email, :logo, :mobile, :phone, :website

  has_many :users

  has_one :company
  has_one :address
  accepts_nested_attributes_for :company, :address
end

我认为这样做的唯一方法是创建自己的 RegistrationsController 以便我可以这样做@client = Client.new,然后在我的视图中这样做:

 <%= f.simple_fields_for @client do |ff| %>
  <%= f.simple_fields_for :company do |fff| %>
    <% field_set_tag t(:company) do %>
      <%= ff.input :name %>
    <% end %>
  <% end %>
  <%= f.simple_fields_for :address do |fff| %>
    //address inputs
    <% end %>
  <% end %>

  <fieldset>
    <legend><%= t(:other) %></legend>
    // other inputs
  </fieldset>
<% end %>

我需要它以这种方式工作的原因是因为我有多个用户可以代表同一个客户端(因此需要访问相同的数据)。我的客户拥有应用程序中的所有数据,因此需要在使用应用程序之前创建。

4

1 回答 1

7

好的,我花了大约 8 个小时,但我终于想出了如何让它工作(如果有人有更好/更清洁的方法,请告诉我)。

首先,我创建了自己的Devise::RegistrationsController以正确构建资源:

class Users::RegistrationsController < Devise::RegistrationsController

  def new
    resource = build_resource({})
    resource.build_client
    resource.client.build_company
    resource.client.build_address
    respond_with resource
  end

end

之后我只需要调整 config/routes.rb 以使其工作:

devise_for :users, :controllers => { :registrations => "users/registrations" } do
    get '/users/sign_up', :to => 'users/registrations#new'
  end

我的设计/注册/new.html.erb 中也有错误。它应该是f.simple_fields_for :client而不是f.simple_fields_for @client.

现在它正确地为嵌套属性创建了所有对象,并在保存资源时自动保存它。

于 2012-12-07T08:32:51.767 回答