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。
就我个人而言,我会把'@ group'定义放在'before_filter'中,并在'ProjectsController'中的每个动作之前调用它' – 2011-04-27 08:43:18
这就是我所做的。我不明白的是,如何访问我的_form.html.erb中的@group? @group总是在那里。 – MrB 2011-04-27 08:50:55
我在创建操作中完成了构建,而不是before_filter。 (澄清) – MrB 2011-04-27 08:51:43