【问题标题】:Rails link_to an .each joinRails link_to 一个 .each 连接
【发布时间】:2014-09-29 05:10:33
【问题描述】:

我有这段代码将一个表关联到另一个表。使用 Set 它收集所有数据,如果有其他类似的值,则只显示一次。

genre_names = Set.new
<% @pm_relationships = PmRelationship.where(:people_id => @person.id) %>

<% @pm_relationships.each do |pm_relationship| %>
  <% @movie=Movie.find(pm_relationship.movie_id) %>
  <% @mg_relationships = MgRelationship.where(:movie_id => @movie.id) %>

  <% @mg_relationships.each do |mg_relationship| %>
    <% @genre=Genre.find(mg_relationship.genre_id) %>
    <% genre_names.add(@genre.name) %>    
  <% end %>
<% end%>

# actual view code
<ul class="basic-info-genres">
  <%= "<li>#{genre_names.to_a.join('</li><li>')}</li>".html_safe %>
</ul>

我的问题是 link_to 如何在提供的打印代码中工作

&lt;%= "&lt;a&gt;&lt;li&gt;&lt;button&gt;&lt;span&gt;#{genre_names.to_a.join('&lt;/span&gt;&lt;/button&gt;&lt;/li&gt;&lt;/a&gt;&lt;a&gt;&lt;li&gt;&lt;‌​‌​button&gt;&lt;span&gt;')}&lt;/span&gt;&lt;/button&gt;&lt;/li&gt;&lt;/a&gt;".html_safe %&gt;

如何使上面的打印有这个链接到/genres/&lt;%=@genre.id%&gt;

我试过了

&lt;%= "&lt;a href='/genres/#{@genre.id}'&gt;&lt;li&gt;&lt;button&gt;&lt;span&gt;#{genre_names.to_a.join('&lt;/span&gt;&lt;/‌​‌​button&gt;&lt;/li&gt;&lt;/a&gt;&lt;a&gt;&lt;li&gt;&lt;button&gt;&lt;span&gt;')}&lt;/span&gt;&lt;/button&gt;&lt;/li&gt;&lt;/a&gt;".html_safe %&gt;

但这仅链接到显示的第一个流派

有什么想法吗?

谢谢

【问题讨论】:

    标签: ruby-on-rails join hyperlink set


    【解决方案1】:

    将整个@genres 添加到流派,而不仅仅是@genre-name,然后您可以在视图代码中使用each-loop。

    对于控制器(你应该有你的程序逻辑):

     @genres = Set.new 
     @pm_relationships = PmRelationship.where(:people_id => @person.id) 
     @pm_relationships.each do |pm_relationship| 
       movie=Movie.find(pm_relationship.movie_id) 
       @mg_relationships = MgRelationship.where(:movie_id => movie.id)
       @mg_relationships.each do |mg_relationship| %>
         genre=Genre.find(mg_relationship.genre_id) %>
         @genres.add(genre) %>    
       end
     end
    

    对于视图:

     <ul class="basic-info-genres">
       <% @genres.each do |genre| %>
         <li><%= link_to genre.genre_name, "#{root_url}genres/#{genre.id}" %></li>
       <% end %>
     </ul>
    

    【讨论】:

    • 使用genres.each返回undefined local variable or method genre,如果我使用genre_names.each我得到相同的输出除了链接对于所有类型都是相同的
    • 当然你必须定义@genres。我已经用控制器的相应代码更新了帖子。
    【解决方案2】:

    如果我理解正确,您希望链接与电影相关的所有类型。

    为此,请在您的控制器中加载用户电影的类型。通过正确的关联设置,这就像@person.genres 一样简单。所以让我们这样做吧。

      class Person < ActiveRecord::Base
        has_many :pm_relationships
        has_many :movies, through: :pm_relationships
        has_many :genres, through: :movies
      end
    
      class PmRelationship < ActiveRecord::Base
        belongs_to :person
        belongs_to :movie
      end
    
      class Movie < ActiveRecord::Base
        has_many :mg_relationships
        has_many :genres, through: :mg_relationships
      end
    

    通过该设置,在您的控制器中,只需设置一个实例变量以列出 @person 的所有流派

    @genres = @person.genres
    

    然后在您看来,使用link_to 的块形式,这样编写html 代码会更容易

    <ul class="basic-info-genres">
      <% @genres.each do |genre| %>
        <%= link_to genre do %>
          <li>
            <button>
              <span><%= genre.name %>‌</span>
            </button>
          </li>
        <% end %>
      <% end %>
    </ul>
    

    【讨论】:

      【解决方案3】:

      基本上,您不能在ul 中使用任何直接子元素代替li。您需要在li 中包含&lt;a&gt;,但是,我们可以将css 应用到&lt;a&gt;,这样看起来整个“li”都有可点击的链接。

      根据您的实际代码,更新 sn-p。

      <ul class="basic-info-genres">
        <% genre_names.each do |genre_name| %>
          <li>
            <%= link_to genre_name, genre_path(@genre), :class => 'clickable-li' %>
          </li>
        <% end %>
      </ul>
      

      您需要将&lt;a&gt; 设置为display: block;

      # css file
      .clickable-li {
        display: block;
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2014-05-23
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 2013-07-22
        • 1970-01-01
        相关资源
        最近更新 更多