首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器方法来显示一个字段的所有实例,没有重复的ruby

控制器方法来显示一个字段的所有实例,没有重复的ruby
EN

Stack Overflow用户
提问于 2017-05-02 13:29:49
回答 1查看 29关注 0票数 0

我正在制作一个博客,我需要在列表中显示与用户类型相关的所有标记,并链接到每一组具有该标记的帖子。我想要创建一个控制器方法来调用视图来显示唯一标记的列表。这是我的控制器和视图。我该怎么做?

控制器

代码语言:javascript
复制
  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

我的视图显示当前的标签如下所示

代码语言:javascript
复制
<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 %>

这似乎又长又没有必要。每个邮报都有一系列这样的标签。

代码语言:javascript
复制
tags = ["real estate", "property management", "rental"]

我希望它在所有post中显示所有标记的列表,但只显示每个实例一次,当您单击该标记时,它应该显示包含该实例的所有帖子。

提前感谢您的帮助。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-05-02 13:39:39

你应该能做这样的事

代码语言:javascript
复制
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的功能。

然后你的观点就变成

代码语言:javascript
复制
<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>

基于评论的编辑:假设一篇文章看起来像

代码语言:javascript
复制
<% @manager_posts.each do |post| %>
  <div class='<%= "post #{post.tags.join(' ')" %>' /> 
<% end %>

那么这个jQuery应该一次只为一个标记工作,示例

代码语言:javascript
复制
$(document).ready(function(){
  $('.post_filter').on('click',function(event){
    var tag = $(this).data("tag")
    $('div.' + tag).show();
    $('div:not(.' + tag + ')' ).hide(); 
  });
});

如果你想一次选择多个标签,我认为你最好尝试为你自己设置这些标签。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/43739180

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档