1

我与链接框有多对多的关系,我想将这些模型合并到一个表单中,以便我可以从同一页面进行更新。我真的很难让 check_box 甚至显示我的数组的所有元素 - 我已经搜索了网络并且整天都在研究这个,我发现很难应用我正在阅读的信息我的问题。我对 RoR 也非常陌生,而且我一直在关注一些过时的视频教程(2.0 之前),所以为我的代码道歉。到目前为止,我已经让它只输出数组中的一个密钥对(最后一个) - 尽管在表单之外,教程中使用的代码完全按照它应该的方式工作。不过那用处不大!Host 是主要表单所针对的模型,而 Billing 是我试图添加到表单中的外部模型。

这是教程中表格之外的代码:

<% for billing in @billings -%>
<%= check_box_tag('billing_title[]', billing.id, @host.billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end -%>

我只需要知道如何使它在表单中工作。这是前面提到的代码,它只在遍历它们后检索最后一个数组密钥对:

<% f.fields_for :billings do |obj| %><br />
<%= check_box_tag('billing_title[]', billing.id, @billings.collect
{|obj| obj.id}.include?(billing.id))%> <%= billing.title %><br />
<% end %>

调试(@billings):

--- 
- !ruby/object:Billing 
attributes: 
title: Every Month
id: "1"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 12 Months
id: "2"
attributes_cache: {}

- !ruby/object:Billing 
attributes: 
title: 6 Months
id: "5"
attributes_cache: {}

任何帮助都非常感谢。

4

3 回答 3

2

克雷格,听起来您正在寻找的是 Accepts_nested_attributes_for ,这是一种处理表单中嵌套模型的更好方法。

与其只是窃取 Ryan 的所有作品并在此处重新发布,不如给您一个指向他的截屏视频的链接:

http://railscasts.com/episodes/196-nested-model-form-part-1

这是基于他的复杂形式系列。

您应该能够根据您正在尝试做的事情定制本教程,但如果不是,我很乐意提供帮助。

编辑:

好吧,在查看您的代码之后,有一些事情会导致您出现问题。:)

首先,有了关联,您不需要为 billings 提取额外的集合,即:

@host = Host.find(params[:id])
@voips = Voip.find(:all)
@custsupps = Custsupp.find(:all)
@payments = Payment.find(:all)
@billings = Billing.find(:all) # <-- This is not needed and causing your problems

模型中的关联设置为您完成了这一切。这是rails的魔力的一部分。:D

现在,重要的是要注意,在使用关联时,您需要确保对象实际上是关联的。换句话说,如果您的数据库中有 3 个 Billings 对象并且它们与您的 Host 对象没有关联,它们将不会显示在表单中。

如果您尝试使用复选框将帐单与主机相关联,您将需要采用不同的方法,因为您的表单仅显示与主机关联的帐单。

如果您只是尝试编辑或修改与主机关联的现有账单,例如,复选框代表“付费”属性(布尔值),那么这种方法很好,您的表单代码将如下所示:

<% f.fields_for :billings do |b| %><br />
  <%= b.check_box :paid %> <%= b.title %>
<% end %>

因此,也许从功能的角度澄清您要完成的工作,我们可以找到更好的解决方案。

于 2010-03-29T22:46:23.133 回答
0

我不确定我的答案,但我会尝试...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>
于 2010-03-29T20:38:00.280 回答
0

在我看来这是for循环的问题......

在您的示例代码中,您正在循环@billings(从您的控制器传递的一组 billings 对象),并调用当前的billing.

在您的表单代码中,您正在循环:billings(引用帐单 ActiveRecords 的符号)并调用当前的obj. 然后,令人困惑的是,您的代码在 @billings.collect 函数中再次重新使用了变量名obj......但这应该具有本地私有范围并且不会影响您的主循环,但很难一眼就能理解。

无论如何,由于表单循环中的内容没有引用obj,因此它正在使用变量billing-- 在您循环时不会更改,但会保留它的最后一个值:上一个循环中的最后一项!这解释了为什么您只看到最后一个标签。(此外,该debug(@billings)函数自己循环遍历各种记录——它不在 fields_for do 循环内。)

我将从更改表单代码的第一行以再次重新使用变量名称billing开始,如下所示:

<% f.fields_for :billings do |billing| %><br />

Ruby 的块语法一开始可能会很混乱——或者,见鬼,任何时候你在阅读不是你自己编写的代码——但是当你把它分解成基本的组件时,它通常只是循环通过一组项目并在每一个上执行一些功能。还要注意外观相似的名称之间的混淆:@billing、@billings、:billings 和 billings 对于 Ruby 和 Rails 来说都是不同的东西。祝你好运!

于 2010-03-30T05:01:39.817 回答