2011-04-27 78 views
0

我有一個資源「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 

希望這會有所幫助。謝謝。

回答

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是零表單中的(我猜這是在新動作中調用),那麼你可以在你的新動作中添加@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