2010-04-15 100 views
1

我已经使用Ruby on Rails构建了一个博客应用程序。在应用程序中,我有帖子和标签。发布has_many:标签和标签belongs_to:发布。显示传递的参数问题的帖子 - Ruby on Rails

在/views/posts/index.html视图中我想显示两件事情。首先是所有显示'created_at DESC'的帖子的列表,然后在侧栏中,我想引用我的标签表,组记录和显示为允许使用该标签查看所有帖子的链接。

更新: 显示重复帖子和帖子无w/o标签不显示的问题已修复。试图找出现在,如何处理/ posts?tag_name = foobar请求,以便只显示具有该标记的帖子。

更新代码: 帖子显示正确无重复。标记计数工作正常,标记组显示为链接并将tag_name传递到/ posts?tag_name = new。我只是不能得到链接触发只显示这些标签的帖子的显示。仅供参考,帖子在标签表中由post_id标识。

PostsController

def index 
    @tag_counts = Tag.count(:group => :tag_name, :order => 'updated_at DESC', :limit => 10) 
    @posts = Post.all(:order => 'created_at DESC').paginate :page => params[:page], :per_page => 4, 
       :conditions => (params[:tag_name] ? 
       { :tags => {:tag_name => params[:tag_name]} } : {} 
       ) 

    respond_to do |format| 
     format.html # index.html.erb 
     format.xml { render :xml => @posts } 
     format.json { render :json => @posts } 
     format.atom 
    end 
    end 

查看

Recently Used Tags 
     <table> 
      <% @tag_counts.each do |tag_name, tag_count| %> 
       <tr> 
        <td><%= link_to(tag_name, posts_path(:tag_name => tag_name)) %></td> 
        <td>(<%=tag_count%>)</td> 
       </tr> 
      <% end %> 
      </table> 
      <br> 
      <a href="/tags">click to view all tags >></a> 
      </div> 

该屏幕截图可以帮助(请注意这是刚刚工作的功能真的很丑),因为它表明,在新的只有1个标签,但当URL被击中时,仍然显示所有帖子。

alt text http://gadocidesign.squarespace.com/storage/Screen%20shot%202010-04-15%20at%204.05.13%20PM.png

回答

1

要获得所有帖子:

@posts = Post.all.paginate :page => params[:page], :per_page => 5 

要显示这篇文章的标签:

<% @posts.each do |post| %> 
    <% post.tags.each do |tag| %> 
     <%= tag.tag_name %> 
    <% end %> 
<% end %> 

我相信这是你想要的。

编辑#1

要显示在侧栏中的标签:

<% Tags.count(:group=>"tag_name").each_pair do |key, value| %> 
    <% link_name = Tags.find(key).tag_name %>(<%= value %>) 
    <%= your_link %> 
<% end %> 

这将显示所有职位()之间的数字标签。但我不知道如何建立你的链接......也许如果你给一些更多的信息,我不知道...你有search方法?

反正...希望它可以帮助你:]

编辑#2

找你做另外一个问题,看到一些代码,我相信,这将解决您的问题:

#view 
<% Tags.count(:group=>"tag_name").each_pair do |key, value| %> 
    <% tag_name = Tags.find(key).tag_name %> 
    <%= link_to(tag_name+"(#{value})", posts_path(:tag_name => tag_name)) %> 
<% end %> 

#controller 
@posts = Post.all.paginate :page => params[:page], :per_page => 5, 
    :conditions => (params[:tag_name] ? 
     { :tags => {:tag_name => params[:tag_name]} } : {} 
    ) 

希望它现在有效。

+0

地址后显示,但我也试图分组,链接到搜索,并通过索引方法@post变量显示标签组以及。 – bgadoci 2010-04-15 16:52:58

+0

看到我编辑的答案:] – 2010-04-15 17:29:54

+0

好吧,这是一种工作,因为重复消失了。当输入URL/posts?tag_name = new时,这是打嗝,它不会仅显示带有该标记的帖子。有任何想法吗? – bgadoci 2010-04-15 20:10:21

0

连接将为每一行创建一个单独的条目 - 当您在tgas上加入文章时,这意味着行已成为Post + Tag元对象的一种。因此,您会为每个标记+帖子发布后贴标签。

你可能只是想把所有帖子都拉出来而已:include =>:tags 这意味着所有帖子都会出现(不管它是否有标签)。

当然,将它与标签条件混合使它更复杂一点。如果您专门寻找具有给定名称的标签的帖子,则您不太可能找到没有标签的帖子...

如果只有一个标签可能带有给定的标签名称,做得更好,像这样做:

@posts = Tag.find_by_tag_name(params[:tag_name]).posts 
+1

有没有办法可以应用a:limit或:group到现有的代码来修复它?就你所建议的代码而言,标签表中有多个记录,因此分组。每当有人在帖子中添加一个标签时,它会创建一个新记录,然后代码正在寻找标记名称,分组并显示为链接。单击链接通行证将tag_name传递给控制器​​,控制器然后引用标签表并为每个标签取出标签。这就是问题所在,它为每个标签显示重复的帖子。 – bgadoci 2010-04-15 17:22:07