在孙子form_for中自动填充父级和祖父级ID

时间:2013-07-01 20:20:12

标签: ruby-on-rails nested 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。我不希望用户每次都必须选择国家/地区和州,因为他们从国家/地区视图创建新状态,并且他们从州视图创建新区域。

那么,如何将Country和State id传递给form_for?

2 个答案:

答案 0 :(得分: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]

也会奏效。那就是那里的模式 - 取决于你的路线。

希望有所帮助!

答案 1 :(得分: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 %>