Rails link_to .each join

时间:2014-08-06 10:01:38

标签: ruby-on-rails join hyperlink set

我有这个代码将一个表与另一个表相关联。使用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如何在提供的打印代码中起作用

<%= "<a><li><button><span>#{genre_names.to_a.join('</span></button></li></a><a><li><‌​‌​button><span>')}</span></button></li></a>".html_safe %>

如何使上述打印链接到/genres/<%=@genre.id%>

我已经尝试了

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

但这只链接到第一个显示的类型

有什么想法吗?

由于

3 个答案:

答案 0 :(得分:1)

添加整个@genres的流派,不仅仅是@ genre-name,那么你可以在视图代码中使用每个循环。

对于Controller(你应该有你的程序逻辑):

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

答案 1 :(得分:0)

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

要执行此操作,请在控制器中加载用户电影的流派。使用正确的关联设置,这就像@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>

答案 2 :(得分:0)

基本上,您不能在li内拥有任何直接的子元素,而不是ul。您需要在<a>li,但是,我们可以将css应用于<a>,以便它看起来像整个&#39; li&#39;有可点击的链接。

从实际代码中,更新代码段。

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

您需要将<a>设置为display: block;

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