显示三重嵌套表单值 (Rails 5.1)

Displaying Triple Nested Form Values (Rails 5.1)

我在弄清楚如何在三重嵌套资源中显示最深的值时遇到了问题。 (Roast, Country, Region).

我可以显示第一个级别:

<% for countries in @roast.countries %>
   <br />
  <strong>Country:</strong>
  <%= countries.country_name %>
<% end %>

但是我无法显示下一层。

undefined method 'regions' for #<Country::ActiveRecord_Associations_CollectionProxy:0x007fbaf8ad25b8>

我尝试了以下方法,但这不起作用。

<% for regions in @roast.countries.regions %>
   <br />
  <strong>Country:</strong>
  <%= countries.regions.region_name %>
<% end %>

@roast.country.regions也不行。

粗略地说,它应该是这样的:

<% @roast.countries.each do |country| %>
  <div class='country-container'>
    <div class='country title'>
      Country:
    </div>
    <div class='country-name'>
      <%= country.country_name %>
    </div>
    <div class='regions-container'>
      <div class='region title'>
        Regions:
      </div>
      <div class='regions'>
        <% country.regions.each do |region| %>
          <div class='region'>
            <%= region.name %>
          </div>
        <% end %>  
      </div>
    </div>
  </div>
<% end %>

所有那些 divsclasses 将让你在 css 中做你的造型,而不是必须做 <strong>,等等。例如,如果你正在使用sass,你可以这样做:

.country-container
  .title
    font-weight: bold
    font-size: 110%
    &.country 
      color: red 
    &.region
      color: blue
  .regions-container
    .region
      color: green

这个:

<% for countries in @roast.countries %>

不是很 ruby 风格。您应该改用 each

<% for country in @roast.countries %>
  <br />
  <strong>Country:</strong>
  <%= country.country_name %>

  <br/>
  <p>Regions:</p>
  <% for region in country.regions %>
    <%= region.region_name %>
  <% end %>
<% end %>

每个国家/地区 select 地区

如果你只有一个国家,你需要获取这个国家的所有地区,那么循环看起来像这样

<% for region in @roast.countries.first.regions %>
    <br />
    <strong>Region:</strong>
    <%= region.region_name %>
<% end %>

或者,如果您需要显示所有国家/地区的所有区域,则循环看起来像这样

我猜模型关系看起来像

class Roast < ApplicationRecord
    has_many :countries
end

class Country < ApplicationRecord
    belongs_to :roast
    has_many :regions
end

class Region < ApplicationRecord
    belongs_to :country
end

然后

<% for country in @roast.countries %>
    <br />
    <strong>Country:</strong>
    <%= country.country_name %>

    <% for region in country.regions %>
        <br />
        <strong>Region:</strong>
        <%= region.region_name %>
    <% end %>
<% end %>

最可取的是 ruby each 方法而不是下面的 loop

<% @roast.countries.each do |country|  %>
    <br />
    <strong>Country:</strong>
    <%= country.country_name %>

    <% country.regions.each do |region|  %>
        <br />
        <strong>Region:</strong>
        <%= region.region_name %>
    <% end %>
<% end %>