我有一个链接框许多一对多的关系,我想这些模型一起拉成一个形式,所以我可以在同一页面更新。我真的得到check_box甚至显示我的阵列中的所有元素挣扎 - 我已经冲刷净,并一直对这个字面了一整天,我发现很难申请我读的信息我的问题。我也非常新,以回报率和我一直在下面有点过时的视频教程(预2.0),这样的道歉我的代码。到目前为止,我已经得到了它仅输出一个数组中的密钥对(最后一个) - 虽然形式外,本教程中使用的代码工作究竟应该如何。用处不大,虽然多数民众赞成!主机是其主要形式是模型,和计费是我想要添加到窗体外面的模型。

这是从工作教程的形式以外的代码:

<% 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: {}

任何帮助真正赞赏。

有帮助吗?

解决方案

克雷格,这听起来像你正在寻找的是accepts_nested_attributes_for这是在表单处理嵌套模型一个更好的方法。

而不是仅仅盗取所有瑞恩的工作,在这里贴一次,我只给你一个链接到他的截屏:

http://railscasts.com/episodes/196-nested -model外形部分-1

这是基于脱下复杂形式系列。

您应该能够泰勒本教程中你正在尝试做的,但如果不是我很乐意帮助。

修改

好吧,看你的代码后,有导致您的问题的几件事情。 :)

首先,与各协会,你不需要拉额外收集账单,即:

@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

在模型中的关联安装,这一切为您服务。这是轨道的魔法的一部分。 :d

现在,一定要注意使用的关联,当你需要确保的对象实际上是关联是非常重要的。换句话说,如果你在你的数据库中3点比灵斯的对象,他们不与你的主机对象关联,他们不会在形式显示出来。

如果你正在尝试,因为只显示比林斯的您的形式已经关联的与您的主机,以计费为主机使用,你会想采取不同的方法复选框关联。

如果您只是想编辑或修改被关联到主机,其中的复选框表示实例的“支付”属性。(布尔)现有比林斯,那么这种做法是好的,你的表单代码会是这个样子:

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

因此,也许说明你试图从功能的角度来完成什么,我们可以找到一个更好的解决方案。

其他提示

我不知道我的答案,但我会尽力...

<% f.fields_for :billings, @billings do |obj| %>
   # ...
<% end %>

在我看来就像是用for循环...

问题

在您的示例代码,则通过@billings循环(帐单对象数组从控制器传递),并且调用当前一个billing

在您的形式的代码,则通过:billings循环(符号参照该账单ActiveRecords)和调用当前一个obj。然后,容易混淆,你的代码又在@ billings.collect功能再使用变量obj ...但是这应该有当地的私营范围,不会影响你的主循环,但它是很难解释的视线。

不管怎样,因为你的形式循环内的东西不参考obj,它使用的是可变billing - 这不会改变你的时候遍历,但保留最后一个值它有:最后一个项目从以前的循环!这就解释了为什么你只能看到最后一个标签。 (另外,debug(@billings)函数执行其自身的循环通过各种各样的记录 - 它不是fields_for做循环内。)

我将开始改变你的表格第一行代码来重新再次使用变量名billing,像这样的:

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

的Ruby的块语法可以相当混乱,在第一 - 或者说,赫克,任何时候你“重新阅读代码你没有写自己 - 但是当你打破了这一切的基本组成部分,它通常只是通过一组项目的循环,并在每一个执行某些功能。同时还要注意长得十分相似的名称之间的困惑:@billing,@billings,:账单和账单都是不同的事情,Ruby和Rails。祝好运!

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top