Rails:嵌套资源的自动填充参考

问题描述:

我有一个资源“Project”嵌套在资源“Group”中。在我的演出组页面上,我列出了该组的所有项目。我还添加了一个“新项目”链接导致Rails:嵌套资源的自动填充参考

new_group_project_path(@group) 

但在随后的新项目的形式,用户仍然需要输入组的ID,即使他只是点击了一个新的项目链接特定组的页面。我试过

<%= f.text_field :group_id, :value => @group.id %> 

但@group似乎是零,即使我把它传递给链接。

如何自动填充该字段与group_id,甚至隐藏用户的整个事情,因为它已经预先确定,他不应该考虑这一点?

感谢,

MRB

[编辑]

这里有更多的我的代码,以澄清:

1 class ProjectController < ApplicationController 
    2 def new 
    3  @group = Group.find(params[:group_id]) 
    4  @project = @group.projects.build 
    5  respond_with(@project) 
    6 end 
    7 
    8 def create 
    9  @group = Group.find(params[:group_id]) 
10  @project = @group.projects.build(params[:projects]) 
11 end 
12 end 

而在_form.html.erb

26 <% if @group.nil? %> 
25  <div class="field"> 
26  <%= f.label :group_id %><br /> 
27  <%= f.text_field :group_id %> 
28  </div> 
29 <% end %> 

路线s.rb:

5 resources :groups do 
    4  resources :projects 
    5 end 
    6 
    7 resources :projects 

希望这会有所帮助。谢谢。

如果你在你的routes.rb中嵌套了控制器,那么你不需要在表单中做任何额外的事情。所以,如果你的routes.rb看起来是这样的:

resources :groups do 
    resources :projects 
end 

它看起来像从path_helper,那么你将永远有可从路由GROUP_ID。因此,当用户提交表单到ProjectsController您创建的行动,你可以处理它是这样的:

@group = Group.find(params[:group_id]) 
@project = @group.projects.build(params[:project]) 

编辑:

如果@group是零表单中的(我猜这是在新动作中调用),那么你可以在你的新动作中添加@group = Group.find(params [:group_id])(这将违背Rails的DRY主体),或者做Ryan建议并添加的内容它在看起来像这样的before_filter中:

class ProjectsController < ApplicationController 
    before_filter :find_group 

    ... 

private 
    def find_group 
    @group = Group.find(params[:group_id]) 
    end 
end 

Tha t将使该控制器中的所有操作都可用@group变量。私有的声明只能确保控制器外部没有任何东西可以调用find_group。

+0

就我个人而言,我会把'@ group'定义放在'before_filter'中,并在'ProjectsController'中的每个动作之前调用它' – 2011-04-27 08:43:18

+0

这就是我所做的。我不明白的是,如何访问我的_form.html.erb中的@group? @group总是在那里。 – MrB 2011-04-27 08:50:55

+0

我在创建操作中完成了构建,而不是before_filter。 (澄清) – MrB 2011-04-27 08:51:43