嘿傢伙,我無法理解Rails構造。我正在使用Rails 3,但我懷疑這是特定於此版本的。Rails模型 - 關聯表格問題
我有一個模型,Goal
那has_many :commits
和自然,Commit
模型belongs_to :goal
。我創建了適當的遷移,以便commits_table.references :goal
。
我實際上是通過Rails Getting Started指南,除了那篇文章中他們分別使用Post
和Comment
。
現在我已經描述了情況,我可以表達我的困惑。在Goal
的顯示視圖中,我嵌入了一個表單來創建一個新的提交,它與當前查看的目標「附加」。這工作正常,所有。然而,我無法理解爲什麼我們做這個
<%= form_for([@goal, @goal.commits.build]) do |f| %>
不是應該form_for(@commit)
?我明白爲什麼我們想要@goal
提供一些上下文,因爲提交是一個嵌套的資源。但是,在實際生成的源中,表單被合適地命名爲commit,即字段名爲commit_blah
。 Rails如何知道這一點?我知道有這整個系統的「信任和魔力」等等,但我的意思是至少在高層次上,從代碼暗示的Rails中我想要一個提交?
我看着documentation for form_for它似乎是其中一個參數可能是採取的形式的行動。我想在這種情況下,這就是@goal.commits.build
參數的用途?指定要採取的行動?這是Rails如何推斷我想要提交?這也能解釋爲什麼這個表格是由Commit
控制器處理的,即使這個代碼是在目標的視圖中?
此外,爲什麼這些參數作爲數組傳遞([]
)?在Ruby中,該方法仍然只是將它作爲兩個單獨的參數,或者有這個原因通過這種方式的原因嗎?
最後,rails generate
自動給我在我的其他_form.html.erb
諧音一些錯誤顯示代碼:
<% if @commit.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@commit.errors.count, "error") %> prohibited this commit from being saved:</h2>
<ul>
<% @commit.errors.full_messages.each do |msg| %>
<li><%= msg %></li>
<% end %>
</ul>
</div>
<% end %>
如果我想要將它添加到這個嵌入式的形式,我會怎麼做呢?我想我的問題是,我會用什麼來代替@commit
?
謝謝。我只是試圖讓我的頭腦圍繞這些新概念。
關於你在form_for([@ goal,@ goal.commits.build])中@goal的目的問題''。在Rails代碼中很難看到,但是該數組傳遞給了其他各種Rails方法。最終,Rails將使用該數組的信息爲您創建一個嵌套路由('/ goals/1/commits/new')。從'form_for'代碼,你必須查看#apply_form_for_options!(record_or_name_or_array,options) - > #polymorphic_path() - > #polymorphic_url - > #build_named_route_call的代碼。 – monocle 2010-11-06 22:53:07
所以我猜'慣例'是傳遞'上下文',可以這麼說,以便它可以構建嵌套的資源。 '約定'也是讓數組的最後一個元素成爲我們實際想要構建的元素。非常感謝! – 2010-11-06 23:00:45