2011-03-23 49 views
1

我有一個表單。如何在視圖中爲Rails 3中的多個模型使用單個窗體?

該窗體當前處於查看模型消息。

有時,我希望能夠將聯繫人(名字,姓氏)與該特定的消息相關聯。聯繫是它自己的模型。

提交表單時,Message具有contact_id屬性。我想要contact_id關聯,但也要創建一個新的聯繫人。

我該如何在Rails 3中做到這一點?

回答

2

看來你要聯繫人和消息對象都是使用相同的表單創建的,並使其關聯。正如我在前一個問題中告訴你的。 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

+0

感謝...我不知道是否嵌套他們,因爲,例如,與一個消息相關的聯繫人可能會在另一個消息中被提供給另一個人......但是,如果我創建has_one,你的觀點(我假設我必須傳遞消息_id屬性contact_id)我只需要保存@contact是我期待...這聽起來對嗎? – Angela 2011-03-25 03:48:50

+0

是啊..如果你的contact.rb中有'has_one:message',那麼當你給出'@contact.message = @ message'並且你保存'@ contact.save'時,聯繫對象和消息對象被保存到數據庫,並在消息中保存'contact_id'作爲新保存的'contact'記錄的'id'。所以,你只需要做'@ contact.save' – rubyprince 2011-03-25 05:33:18

相關問題