我有一個表單。如何在視圖中爲Rails 3中的多個模型使用單個窗體?
該窗體當前處於查看模型消息。
有時,我希望能夠將聯繫人(名字,姓氏)與該特定的消息相關聯。聯繫是它自己的模型。
提交表單時,Message具有contact_id屬性。我想要contact_id關聯,但也要創建一個新的聯繫人。
我該如何在Rails 3中做到這一點?
我有一個表單。如何在視圖中爲Rails 3中的多個模型使用單個窗體?
該窗體當前處於查看模型消息。
有時,我希望能夠將聯繫人(名字,姓氏)與該特定的消息相關聯。聯繫是它自己的模型。
提交表單時,Message具有contact_id屬性。我想要contact_id關聯,但也要創建一個新的聯繫人。
我該如何在Rails 3中做到這一點?
看來你要聯繫人和消息對象都是使用相同的表單創建的,並使其關聯。正如我在前一個問題中告訴你的。 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
With an Nested Model Form。
給看看: http://asciicasts.com/episodes/196-nested-model-form-part-1
它是基於on Rails的2,但沒有太多爲了使代碼使用Rails兼容要做3.
感謝...我不知道是否嵌套他們,因爲,例如,與一個消息相關的聯繫人可能會在另一個消息中被提供給另一個人......但是,如果我創建has_one,你的觀點(我假設我必須傳遞消息_id屬性contact_id)我只需要保存@contact是我期待...這聽起來對嗎? – Angela 2011-03-25 03:48:50
是啊..如果你的contact.rb中有'has_one:message',那麼當你給出'@contact.message = @ message'並且你保存'@ contact.save'時,聯繫對象和消息對象被保存到數據庫,並在消息中保存'contact_id'作爲新保存的'contact'記錄的'id'。所以,你只需要做'@ contact.save' – rubyprince 2011-03-25 05:33:18