2010-06-14 60 views
1

对不起,对于半通用标题,但我仍然很新的轨道,并不能想出一个简洁的方式来提出这个问题。Rails拥有和属于许多形式的问题

我有一个基本的habtm模型设置:一个项目有很多资源,一个资源可以有很多项目。我已经正确地设置了数据库和模型,并且可以通过控制台执行所需的任何操作,但是我无法将其全部转换为视图。

关于该项目的show视图,我希望能够创建资源并自动将其分配给当前项目。这里是我的基本的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并从那里开始。这看起来像一个丑陋的kludge。

回答

1

我相信你应该使用类似

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

,但我真的肯定! ;]

+0

这有帮助,我越来越近!在我的project_controller中,这个参数被传递:'project'=> {“resources”=> {“name”=>“New Resource”}}'我怎样才能建立一个新的资源对象?我试过“@new_resource = @ project.resources.build(params [:resources])“但没有奏效。再次感谢。 – swilliams 2010-06-14 19:24:21

+1

我相信正确的是@ project.resources.build(params [:project] [:resources])' – 2010-06-14 19:38:25

+0

哈,是的,我只是想到了我自己,谢谢。 – swilliams 2010-06-14 19:53:22

2

如果您使用的是Rails 2.3或更新的版本,可以尝试使用accept_nested_attributes_for让项目在接收新资源的属性时自动创建资源。它还具有无需为控制器添加任何特殊功能的优势。

Ryan Daigle写道an excellent intro to accepts_nested_attributes_for,还有一个不错的railscast(#196)。

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

+0

这种方法不适用于has_and_belongs_to_many。[由省略记录](http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html) – Maarten 2013-11-26 09:35:48