[英]Rails Model-Association Form Question
大家好,我在理解Rails構造時遇到了麻煩。 我正在使用Rails 3,但是我懷疑這是特定於該版本的。
我有一個具有has_many :commits
Goal
模型,自然而然地,一個belongs_to :goal
的Commit
模型。 我創建了正確的遷移,以便commits_table.references :goal
。
實際上,我正在閱讀《 Rails入門指南》,但在該文章中,它們分別使用了Post
和Comment
。
現在,我已經描述了這種情況,我可以表達我的困惑。 在Goal
的show視圖上,我嵌入了一個表單以創建一個新的Commit,該Commit被“附加”到當前查看的Goal。 一切正常。 但是,我很難理解我們為什么要這樣做
<%= form_for([@goal, @goal.commits.build]) do |f| %>
不應該是form_for(@commit)
嗎? 我理解為什么我們要@goal
提供一些上下文,因為提交是嵌套的資源。 但是,在實際生成的源中,該表單被適當地命名為commit,即字段被命名為commit_blah
。 Rails是怎么知道的? 我了解整個系統都由“信任與魔力”構成,但是至少在高層上,我的意思是從這段代碼向Rails暗示我想要提交嗎?
我查看了form_for的文檔 ,似乎其中一個參數可能是要對表單采取的操作。 我想在這種情況下,這就是@goal.commits.build
參數的作用? 指定要采取的行動? 這是Rails推斷我想要提交的方式嗎? 這是否還會解釋即使目標代碼在目標視圖中也由Commit
控制器處理此表單的原因?
另外,為什么這些參數作為數組( []
)傳遞? 在Ruby中,該方法是否仍將其作為兩個單獨的參數使用,還是有理由將其以這種方式傳遞?
最后, rails generate
自動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
?
謝謝。 我只是想讓我了解這些新概念。
如果您返回文檔並單擊“顯示源代碼”,則會看到
def form_for(record_or_name_or_array, *args, &proc)
...
case record_or_name_or_array
when String, Symbol
...
when Array
object = record_or_name_or_array.last
object_name = options[:as] || ActiveModel::Naming.singular(object)
apply_form_for_options!(record_or_name_or_array, options)
args.unshift object
else
...
end
...
output << fields_for(object_name, *(args << options), &proc)
...
對於form_for,第一個參數可以是記錄,名稱或數組。 在您的情況下,您將其傳遞給數組。 然后,代碼將“對象”確定為該數組的最后一個成員,即@ goal.commits.build對象。 對象名稱由ActiveModel :: Naming.singular方法確定。
console > ActiveModel::Naming.singular(@goal.commits.build)
=> "commit"
然后,它使用fields_for和“ commit”生成了適當的表單字段。
看起來您正在使用嵌套資源。 檢查您的routes.rb文件,看是否有以下內容:
map.resources:commits,:has_many =>:goals
也許:
map.resources:commit做| commit | commit.resources:目標結束
如果是這種情況,那么您將需要將commit和target對象同時提供給form_for方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.