使用 Rails gem "acts-as-taggable-on" 导航

Navigation with Rails gem "acts-as-taggable-on"

我想制作带有特定标签的导航。
这些标签例如:HTML、CSS 和 Javascript.
所以当我点击其中一个时,它会显示所有带有这些标签的帖子。
我怎样才能做到这一点?

我的导航代码现在看起来像这样(它在 Application.html.erb 中)

<%= link_to "Computer", tag_list.Computer %>

我得到这个错误:

undefined local variable or method `tag_list' for #<#:0x007feec764ff88>

我自己得到的。 这是代码:

<%= link_to 'Computer', { :controller => 'posts', :action => 'index', :tag => 'Computer'} %>

控制器看起来像这样:

def index
    if params[:tag]
    @posts = Post.tagged_with(params[:tag]).order('created_at DESC')
else
    @posts = Post.all.order('created_at DESC')
end
end

tag_list 是一个局部变量或方法,因此除非您是在助手中创建它的,否则这是您的第一个问题。第二个是在它上面调用 .Computer 不起作用,因为 tag_list 是由 gem 创建的一种方法,用于列出所有对象标签,并调用 . (也称为链接)正在尝试调用一个名为 Computer 的方法,该方法不存在,它应该只是一个字符串并且必须用引号引起来。

因此,在您的布局视图中,您可以执行

= link_to "Computer", tagged_posts_url(tag: "Computer")

然后在您的 posts_controller.rb 中添加一个名为 tagged

的操作
def tagged
  if params[:tag].present? 
    @posts = Post.tagged_with(params[:tag])
  else 
    @posts = Post.all
  end  
end

要维护一组 DRY 视图,您甚至可以告诉它呈现索引视图,因为您很可能已经有了一个帖子列表,现在它看起来完全一样,但只包含带有该标签的帖子。例如

def tagged
  if params[:tag].present? 
    @posts = Post.tagged_with(params[:tag])
  else 
    @posts = Post.all
  end  
  render "index"
end

然后在您的 config/routes.rb 现有 post 路由下为您的新控制器操作添加路由

resources :posts do
  collection do
    get "/posts/tagged", as: :tagged
  end