Ruby on Rails:一对多关系视图

时间:2009-08-18 17:41:38

标签: ruby-on-rails database view relational

对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

4 个答案:

答案 0 :(得分:2)

假设您只能为每个表单添加一个(与JS相比,添加[n]新的非人工费用),只需在控制器中创建一个空的实例变量。

@new_non_labor_expense = NonLaborExpense.new

在表单中,使用:

构建它
<%= f.text_field :new_non_labor_expense, :amount %>

或者任何适当的成员var和字段类型。

在控制器中,您将获得一个名为“new_non_labor_expense”的参数,可以访问它,验证它,关联它并保存它。或者,如果这些步骤中的任何一个错误,您可以退回并通知用户。

如果您需要添加更多内容,只需创建一个数组,以便传入一个NLE数组。希望这是有道理的。

答案 1 :(得分:1)

另一种选择是fields_for - 这对我来说似乎很合适。查看Railscasts 73 - 75

答案 2 :(得分:0)

non_labor_expenses不是文字字段,这可能是您最大的问题。

更好的方法是创建一个新的non_labor_expense,并在其创建中有一个下拉选择框,用于选择项目的id(或名称,通过id)。

答案 3 :(得分:0)

我认为你需要的是嵌套表格。 Here是一个简单的例子,说明如何使用一对多关系。它自Rails 2.3.2起作用