1

很抱歉这个半通用的标题,但我对 Rails 还是很陌生,想不出一个简洁的方式来提出这个问题。

我有一个基本的 habtm 模型设置:一个项目有很多资源,一个资源可以有很多项目。我已经正确设置了数据库和模型,并且可以通过控制台完成我需要做的所有事情,但是我无法将其全部转换到视图中。

showProject 的视图中,我希望能够创建一个 Resource 并将其自动分配给当前 Project。这是我的基本html:

<p>
  <b>Name:</b>
  <%=h @project.name %>
</p>

<h2>Equipment</h2>
<ul>
  <% @project.resources.each do |r| %>
    <li><%=h r.name %></li>
  <% end %>
</ul>
<h2>Add A Resource</h2>
<% form_for(@project) do |f| %>
  <%= f.error_messages %>

  <p>
    Resource Name:<br />
    <%= f.text_field :resources %>
  </p>
  <p>
    <%= f.submit 'Create' %>
  </p>
<% end %>

显然,这种形式行不通,但我不知道下一步该做什么。我搜索了各种示例,但没有找到我想要在这里做的事情。

我想到的一件事是将表单更改为form_for(Resource.new)并包含@project.id. 然后当resource_controller处理表单时,检查该 id 并从那里开始。不过,这似乎是一个丑陋的杂物。

4

2 回答 2

2

如果您使用的是 Rails 2.3 或更新版本,您可以尝试使用 accept_nested_attributes_for 让您的项目在收到新资源的属性时自动创建资源。它还具有不需要向控制器添加任何特殊内容的优点。

Ryan Daigle 为 accept_nested_attributes_for 写了一篇精彩的介绍,还有一个不错的 railscast (#196)。

虽然我没有尝试过使用 HABTM 关系,但我想它的工作方式与 has_many 示例类似。

于 2010-06-14T20:39:52.197 回答
1

我相信你应该使用类似的东西

<% form_for(@project) do |f| %>
   <%= f.error_messages %>
   <% f.fields_for :resources do |resource_fields| %>
      <%= resource_fields.text_field :name %>          
   <% end %>
<% end %>

但我真的不确定!;]

于 2010-06-14T18:24:53.417 回答