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

时间:2018-02-09 07:55:01

标签: ruby-on-rails nested nested-loops nested-forms

我在解决如何在三重嵌套资源中显示最深层值时遇到问题。 (RoastCountryRegion)。

我可以用以下方式显示第一级:

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

但是我无法展示下一个级别。

  

<Country::ActiveRecord_Associations_CollectionProxy:0x007fbaf8ad25b8>

的未定义方法'regions'

我尝试过以下操作,但这不起作用。

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

@roast.country.regions也不起作用。

3 个答案:

答案 0 :(得分:1)

粗略地说,它应该看起来像:

<% @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 %>

divs classes css允许您在<strong>中设置样式,而不必执行sass等。例如,如果您使用.country-container .title font-weight: bold font-size: 110% &.country color: red &.region color: blue .regions-container .region color: green 1}},你可以这样做:

<% for countries in @roast.countries %>

这:

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 %> 代替。

答案 1 :(得分:0)

INBOX

您为每个国家/地区选择其区域

答案 2 :(得分:0)

如果您只有一个国家/地区,并且需要获取此国家/地区的所有区域,那么循环就像这样

<% 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 %>