我使用Ruby on Rails构建了一个博客应用程序。在应用程序中,我有帖子和标签。发布has_many:标签和标签belongs_to:post。
在/views/posts/index.html视图中,我想显示两件事。首先是显示'created_at DESC'的所有帖子的列表,然后在侧栏中我想引用我的标签表,组记录,并显示为允许查看具有该标签的所有帖子的链接。
更新: 显示重复帖子的问题和没有显示标签的帖子已修复。只是想弄清楚,如何处理/ 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>
这个屏幕截图可能有所帮助(请注意它只是在处理功能时非常难看)因为它显示新的只有一个标签,但是当URL被点击时,仍然显示所有帖子。
答案 0 :(得分: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]} } : {}
)
希望现在有效。
答案 1 :(得分:0)
连接将为每一行创建一个单独的条目 - 当您加入tgas上的帖子时,这意味着这些行已成为一种Post + Tag元对象。因此,您将获得每个标签+帖子的后贴标签。
您可能只想提取所有帖子,只需:include =&gt; :标签 这将意味着所有帖子都会出现(无论是否有标签)。
当然,将其与标签条件混合会使其更复杂一些。如果您专门寻找带有给定名称的标签的帖子,则您不太可能找到没有标签的帖子......
如果只有一个标签带有给定的标签名称,那么你可能会做更好的事情:
@posts = Tag.find_by_tag_name(params[:tag_name]).posts