我有一个资源“Project”嵌套在资源“Group”中。在我的节目组页面上,我列出了该组的所有项目。我还添加了一个“新项目”链接,指向
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 %>
routes.rb中:
5 resources :groups do
4 resources :projects
5 end
6
7 resources :projects
希望这会有所帮助。谢谢。
答案 0 :(得分:1)
如果你已经在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在你的表单中为nil(我猜它是在新动作中调用的)那么你可以在你的新动作中添加@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
这将使@group变量在此控制器的所有操作中可用。私有声明只能确保Controller之外的任何内容都不能调用find_group。