我正在制作一个博客,我需要在列表中显示与用户类型相关的所有标记,并链接到每一组具有该标记的帖子。我想要创建一个控制器方法来调用视图来显示唯一标记的列表。这是我的控制器和视图。我该怎么做?
控制器
def index
@manager_posts = Blog::Post.where(post_type: 'Manager').order('date DESC').limit(4)
@tenant_posts = Blog::Post.where(post_type: 'Tenant').order('date DESC').limit(4)
@blog_list = Blog::Post.order('date DESC').limit(4)
@blog_posts = Blog::Post.paginate(:page => params[:page], :per_page => 5)
@all_post = Blog::Post.all
respond_with(@blog_posts)
end我的视图显示当前的标签如下所示
<h3 class="title">Popular Tags</h3>
<div class="separator-2"></div>
<div class="tags-cloud">
<% if @manager_posts.present? %>
<% @manager_posts.each do |post| %>
<% if post.tags.present? %>
<% post.tags.each do |tags| %>
<div class="tag">
<a href= "#"><%= tags %> </a>
</div>
<% end %>
<% end %>
<% end %>
<% end %>这似乎又长又没有必要。每个邮报都有一系列这样的标签。
tags = ["real estate", "property management", "rental"]我希望它在所有post中显示所有标记的列表,但只显示每个实例一次,当您单击该标记时,它应该显示包含该实例的所有帖子。
提前感谢您的帮助。
发布于 2017-05-02 13:39:39
你应该能做这样的事
def index
#....
@uniq_tags = @manager_posts.flat_map(&:tags).uniq
endflat_map会将结果映射到一个扁平的数组中,所以如果有3个带有["real estate", "property management"],["rental","real estate"],[]]标记的帖子,那么这就变成了["real estate", "property management","rental","real estate"],我相信您可以理解uniq的功能。
然后你的观点就变成
<h3 class="title">Popular Tags</h3>
<div class="separator-2"></div>
<div class="tags-cloud">
<% @uniq_tags.each do |tag| %>
<div class="tag">
<a href= "#" class="post_filter" data-tag='<%= tag %>'><%= tag %> </a>
</div>
<% end %>
</div>
</div>基于评论的编辑:假设一篇文章看起来像
<% @manager_posts.each do |post| %>
<div class='<%= "post #{post.tags.join(' ')" %>' />
<% end %>那么这个jQuery应该一次只为一个标记工作,示例
$(document).ready(function(){
$('.post_filter').on('click',function(event){
var tag = $(this).data("tag")
$('div.' + tag).show();
$('div:not(.' + tag + ')' ).hide();
});
});如果你想一次选择多个标签,我认为你最好尝试为你自己设置这些标签。
https://stackoverflow.com/questions/43739180
复制相似问题