我正在制作一个博客,我需要在列表中显示与某种用户相关联的所有标签,并链接到具有该标签的每组帖子。我想创建一个控制器方法来在视图中调用以显示唯一标签的列表。这是我的控制器和视图。我怎样才能做到这一点?
控制器
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"]
我希望它显示所有帖子中所有标签的列表,但只显示每个实例一次,当您单击标签时,它应该显示包含该实例的所有帖子。
在此先感谢您的帮助。
你应该能够做这样的事情
def index
#....
@uniq_tags = @manager_posts.flat_map(&:tags).uniq
end
flat_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();
});
});
如果您想一次选择多个标签,我认为您最好尝试为自己设置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句