2010-04-15 96 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