Ruby on Rails:一对多关系视图
Posted
技术标签:
【中文标题】Ruby on Rails:一对多关系视图【英文标题】:Ruby on Rails: One to many relationship view 【发布时间】:2009-08-18 17:41:38 【问题描述】:刚接触 Rails 并试图建立并运行一对多的关系。我让它在模型和控制器中工作,但我无法在视图中启动和运行它。
class Project < ActiveRecord::Base
has_many :non_labor_expenses
end
class NonLaborExpense < ActiveRecord::Base
belongs_to :project
end
我通过在控制器中加载 @non_labor_expenses 手动在 non_labor_expense 表中创建了一些条目(编辑操作),并且可以像这样在项目视图中提取现有数据:
<% unless @non_labor_expenses.nil? %>
<% count = 1 %>
<% for expense in @non_labor_expenses %>
<li>
<div class="label"><%= f.label :expense , "Expense" + count.to_s %></div>
<%= '$' + expense.amount.to_s + ' - ' + expense.description.to_s %>
</li>
<% count = count +1 %>
<% end %>
我遇到的麻烦是在项目中添加一个新的 non_labor_expense 条目。我应该能够在后端处理它,但我什至无法让该字段显示在表单中。
这是我现在的位置:
<li class="editable">
<div class="label"><%= f.label :non_labor_expenses %></div>
<%= f.text_field :non_labor_expenses %>
</li>
我知道我上面的代码看起来不像这样,但理想的表单字段应该是这样的:
Expense Amount [text input]
Expense Description [text input]
我的完整表格代码可以在这里找到:http://pastebin.com/m2b280b0f
【问题讨论】:
你能把所有的表单代码贴出来吗? 完整格式代码:pastebin.com/m2b280b0f 【参考方案1】:假设每个表单只能添加一个(相对于JS添加[n]个新的非人工费用),只需在控制器中创建一个空的实例变量。
@new_non_labor_expense = NonLaborExpense.new
在表单中,使用:
<%= f.text_field :new_non_labor_expense, :amount %>
或者任何合适的成员变量和字段类型。
在控制器中,您将获得一个名为“new_non_labor_expense”的参数,并且可以访问它、验证它、关联它并保存它。或者,如果其中任何一个步骤出错,您可以退回并通知用户。
如果您需要添加更多内容,只需将它们组成一个数组,然后传入一个 NLE 数组。希望这是有道理的。
【讨论】:
【参考方案2】:另一个选项是fields_for - 这对我来说似乎工作得很好。查看Railscasts 73 - 75。
【讨论】:
【参考方案3】:non_labor_expenses
不是文本字段,这可能是您最大的问题。
更好的方法可能是创建一个新的non_labor_expense
,并在其创建中有一个下拉选择框来选择项目的 id(或名称,通过 id)。
【讨论】:
我意识到这不是一个文本字段,但我不知道该使用什么。我同意,但是该网站的设计方式是非人工费用需要能够添加到项目编辑页面上。【参考方案4】:我认为您需要的是嵌套表单。 Here 是一个简单的例子,如何用一对多的关系来做。它从 Rails 2.3.2 开始工作
【讨论】:
以上是关于Ruby on Rails:一对多关系视图的主要内容,如果未能解决你的问题,请参考以下文章
Ruby on Rails,一对多关联(One-to-Many)
如何将现有的一对多关系迁移到 Rails 和 ActiveRecord 中的多对多
如何在 Ruby on Rails 中管理嵌套字段的多对多关系