如何在视图中为Rails 3中的多个模型使用单个表单?

时间:2011-03-23 16:20:47

标签: ruby-on-rails forms multiple-models

我有一个表格。

该表单目前位于模型消息的视图中。

有时,我希望能够将联系人(名字,姓氏)与该特定消息相关联。联系方式是它自己的模型。

提交表单时,Message具有contact_id属性。我希望将contact_id关联起来,还要创建一个新的联系人。

如何在Rails 3中执行此操作?

2 个答案:

答案 0 :(得分:2)

您似乎希望从同一表单创建的Contact和Message对象都与它们相关联。正如我在上一个问题中告诉你的那样。 form_for既可以采用独立值,也可以采用其他对象值。

_form.html.erb

<% form_for :message do |f| %>
  <%= f.test_field :some_field %>
  ..
  ..
  <%= text_field :contact, :first_name %>
  <%= text_field :contact, :last_name %>
  <%= f.submit %>
<% end %>

messages_controller.rb

def new
  @message = Message.new
  @contact = Contact.new
end

def create
  @message = Message.new(params[:message])
  @contact = Contact.new(params[:contact])
  @contact.message = @message
  if @contact.save # saves both contact and message if has_one relation is given in models
    ..
  else
    ...
  end
end

但话虽如此,最好使用嵌套表单模型。为此,您必须编写以contact为中心的代码。

contacts_controller.rb

def new
  @contact = Contact.new
  @contact.message.build
end

def create
  @contact = Contact.new(params[:contact])
  if @contact.save
    ..
  else
    ..
  end
end

_form.html

<% form_for :contact do |f| %>
  <% f.fields_for :message do |p| %>
    <%= p.text_field :some_field %>
    ...
  <% end %>
  <%= f.text_field :first_name %>
  <%= f.text_field :second_name %>
  <%= f.submit %>
<% end %>

为此,您必须在Contact.rb中指定accepts_nested_attributes_for :message

答案 1 :(得分:0)

使用嵌套模型表单。

看看: http://asciicasts.com/episodes/196-nested-model-form-part-1

它基于Rails 2,但为了使代码与Rails 3兼容,没有太多工作要做。