簡體   English   中英

Rails模型關聯表單問題

[英]Rails Model-Association Form Question

大家好,我在理解Rails構造時遇到了麻煩。 我正在使用Rails 3,但是我懷疑這是特定於該版本的。

我有一個具有has_many :commits Goal模型,自然而然地,一個belongs_to :goalCommit模型。 我創建了正確的遷移,以便commits_table.references :goal

實際上,我正在閱讀《 Rails入門指南》,但在該文章中,它們分別使用了PostComment

現在,我已經描述了這種情況,我可以表達我的困惑。 Goalshow視圖上,我嵌入了一個表單以創建一個新的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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM