以多模型形式链接两个模型

时间:2011-01-02 23:50:11

标签: ruby-on-rails ruby ruby-on-rails-3

我现在有一个嵌套的多模式表单,使用用户和个人资料。

用户has_one个人资料,个人资料属于用户。

提交表单时,会创建一个新用户,并创建一个新的配置文件,但它们没有链接(这是第一个明显的问题)。用户的模型具有profile_id行,而配置文件的模型具有user_id行。

以下是表单的代码:

<%= form_for(@user, :url => teams_path) do |f| %>


  <p><%= f.label :email %><br />
  <%= f.text_field :email %></p>

  <p><%= f.label :password %><br />
  <%= f.password_field :password %></p>

  <p><%= f.label :password_confirmation %><br />
  <%= f.password_field :password_confirmation %></p>

  <%= f.hidden_field :role_id, :value => @role.id %></p>
  <%= f.hidden_field :company_id, :value => current_user.company_id %></p>

  <%= fields_for @user.profile do |profile_fields| %>

    <div class="field">
    <%= profile_fields.label :first_name %><br />
    <%= profile_fields.text_field :first_name %>
  </div>
  <div class="field">
    <%= profile_fields.label :last_name %><br />
    <%= profile_fields.text_field :last_name %>
  </div>

  <% end %>


  <p><%= f.submit "Sign up" %></p>
<% end %>

第二个问题是,即使通过用户模型的表单成功创建了用户名和密码,也不会创建隐藏字段(role_id&amp; company_id - 也是其他模型的链接)(即使它们是模型的一部分) - 然而,这些值在HTML中成功显示。

任何帮助都会很棒!

根据要求,控制器代码:

  def new
    @user = User.new
    @user.profile = Profile.new
    @role = Role.find_by_name("Regular")

    respond_to do |format|
      format.html # index.html.erb
      format.xml  { render :xml => @teams }
    end
  end

  def create

    @user = User.new(params[:user])
    @profile = Profile.new(params[:profile])

    respond_to do |format|
      if @profile.save && @user.save
        format.html { redirect_to (teams_path) }
        format.xml  { render :xml => @profile, :status => :created, :location => @profile }
      else
        format.html { render :action => "new" }
        format.xml  { render :xml => @profile.errors, :status => :unprocessable_entity }
      end
    end
  end

1 个答案:

答案 0 :(得分:1)

要回答第一个问题,请更改以下内容:

@profile = Profile.new(params[:profile])

@profile = @user.profile.build(params[:profile]) #In the case of a has_many relationship

@profile = @user.build_profile(params[:profile]) #In the case of a has_one relationship

build命令构建一个新的配置文件,并正确设置user_id。

对于第二个问题,您是否可以在新操作期间删除角色和公司的查询,而是在创建操作期间分配这些查询?这将消除传递隐藏参数的必要性。