Rails:在嵌套资源上自动填充引用

时间:2011-04-27 08:21:24

标签: ruby-on-rails nested new-operator

我有一个资源“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

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

1 个答案:

答案 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。