Rails嵌套对象Creationg

时间:2015-07-31 11:38:48

标签: ruby-on-rails-4 nested

我有一个带有以下场景的项目

三个对象:

客户:真实客户端

用户:谁使用门户网站

部门:用户工作的客户(XYZ.com,ABC.com)

注册页面包含:FirstName,用户名,密码,ClientName,电子邮件

客户端只有一个字段值:客户端名称 FirstName,用户名,密码,ClientName,电子邮件属于用户

现在我想要的是创建一个使用ClientName作为部门名称的部门,并将用户与部门的ID相关联。 用户有一个字段department_id

1 个答案:

答案 0 :(得分:1)

即使你的重新制定,仍然不清楚。所以我会按照自己的解释。另外,您没有指定是否使用Mongoid或ActiveRecord。我会选择Mongoid风格,因为它可以产生干净的模型,但可以随意更换ActiveRecord。

模型

class User
  has_one :department
  has_one :client
  accepts_nested_attributes_for :client
  accepts_nested_attributes_for :department

  field :first_name
  field :password
  field :username
  field :email

class Client
  belongs_to :user

  field :name

class Department
  belongs_to :user
  field :name

your_controller.rb

def new
  @user = User.new
  @user.client = Client.new
  @user.department = Department.new
end

def create
  if @user = User.create(user_params)
    redirect_to @user
  else
    render 'new'
  end
end

private
  def user_params
    # Set department.name as client.name
    if params[:user] and params[:user][:department] and params[:user][:client]
      params[:user][:department][:name] = params[:user][:client][:name]
    end
    params.require[:user].permit(
      :first_name, :password, :username, :email,
      client_attributes: [:id, :name],
      department_attributes: [:id, :name]
    )
  end

_form.html.erb

<%= form_for :user do |user| %>
  <%= user.text_field(:name) %>
  ...

  <%= user.fields_for :client do |client| %>
    <%= client.text_field(:name) %>
  <% end %>

  <%= user.fields_for :department do |department| %>
    <p class="text-info">A department will be created with the same name as the client</p>
  <% end %>
<% end %>