2013-07-01 154 views
0

我有三個腳手架:國家,國家和地區。自動填寫父母和祖父母的ID在孫子form_for

我的路線:

NetworkManager::Application.routes.draw do 
    root to: "countries#index" 
    resources :countries 
    resources :states 
    resources :districts  
end 

從國家我去美國。當我從各州返回時,我希望它把我帶到父母國家。與國家相同< - >區。

我知道如何從狀態插入國家鏈接使用country_path(@state.country_id) 我無法自動將正確的國家和州插入狀態和區域form_for自動。我不希望用戶每次都必須選擇國家和州,因爲他們從國家視圖創建新的州,並且他們從州立視圖創建了新的州。

所以,我怎麼通過國家和國家ID來的form_for?

回答

0

意味着你的路線進行適當設置:

resources :countries do 
    resources :states 
end 

resources :states do 
    resources :districts 
end 

(我知道他們是從你前面的問題)

form_for [@country, @state] 

它轉換爲country_and_state_path(@country,@state)。

該數組取決於您的嵌套。如果你正在做的兩道深深的建議,你可以只保留這種模式走下去行:

form_for [@state, @district] 

等如果沒有,那麼這樣的:

form_for [@country, @state, @district] 

也會工作。所以,那裏的模式 - 取決於你的路線。

希望有幫助!

+0

我居然決定不使用任何嵌套了這些的,包括每個單獨的路徑,而不是去,然後就建立它們之間的聯繫。更多信息在一個單獨的答案。也許你可以給我一個更好的方法來做這個建議。 –

0

目前我已經解決了這個問題。雖然,不是我的首選方式:

我將從描述我是如何增加一個地區到一個狀態,因爲這是比較複雜的一個解釋。

國家 - show.html.erb(新路唯一的代碼)設置GET參數,給國家的ID和COUNTRY_ID,最好我想一些其他方式發送這些,但我需要同時發送。

<td colspan=4> 
    <%= 
    link_to 'New District', 
    new_district_path(
     :country_id => @state.country_id, 
     :state_id => @state.id 
    ) 
    %> 
</td> 

區 - new.html.erb(設置COUNTRY_ID和STATE_ID的情況下值或傳遞的參數......我想使用POST發送,而不是那些參數)

<h1>New district</h1> 

<% 
@district.country_id = @district.country_id || params[:country_id] || "" 
@district.state_id = @district.state_id || params[:state_id] || "" 
%> 

<%= render 'form' %> 

<%= link_to 'Back', state_path(params[:state_id]) %> 

區 - _form.html.erb

<%= form_for(@district) do |f| %> 
    <% if @district.errors.any? %> 
    <div id="error_explanation"> 
     <h2><%= pluralize(@district.errors.count, "error") %> prohibited this district from being saved:</h2> 

     <ul> 
     <% @district.errors.full_messages.each do |msg| %> 
     <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

    <div class="field"> 
    <%= f.label :name %><br> 
    <%= f.text_field :name %> 
    </div> 
    <div class="field"> 
    <%= f.label :country_id %><br> 
    <%= f.number_field :country_id %> 
    </div> 
    <div class="field"> 
    <%= f.label :state_id %><br> 
    <%= f.number_field :state_id %> 
    </div> 
    <div class="actions"> 
    <%= f.submit %> 
    </div> 
<% end %> 
+0

一個國家不屬於一個國家嗎?如果是這樣,那麼該地區不需要直接知道它屬於哪個國家,它只需要知道國家。它可以通過州(district.state.country)確定國家。我知道你可能希望頁面上的表單控件允許用戶改變他們的狀態,但是狀態應該給你足夠的信息去做所有事情。所以,也許還有空間來簡化那裏的事情。另外,一個地區可以存在一個零狀態?如果不是,那麼你真的不需要通過這個州,因爲任何現有的地區都會有一個州。 – GoGoCarl

+0

我試圖解決的問題是,當用戶創建一個新的區域時,狀態字段不是自動填充的,因爲我無法拉入狀態ID。我想我可以讓每一個都成爲前一個處理父母與子女關係的子路線。我在這個國家拉的唯一地方是因爲我要求它。但我不一定需要它。我實際上是在每個孩子都知道每個祖先的地方。也許我應該把它變成父母 - 孩子。如果我這樣做,使用嵌套路由比傳遞變量更適合我嗎? –

+0

如果您看起來高於兩個級別(即查找某個地區的國家/地區),則最終需要傳遞這些變量。在這方面它不是相互排斥的。在創建新實體時,層次結構爲您提供的唯一幫助就是幫助您創建新實體,因爲它假設您將在父級上下文中創建新實體(即從現有狀態頁面創建新區域)。但是爲了展示/編輯,你不需要等級。 – GoGoCarl