使用Rails gem导航“act-as-taggable-on”

时间:2015-10-14 22:57:06

标签: html ruby-on-rails

我想使用特定标签进行导航 这些标签例如是:HTML,CSS和Javascript 因此,当我点击其中一个时,它会显示所有带有这些标签的帖子 我怎样才能做到这一点?

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

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

我收到此错误:

  

#&lt;#:0x007feec764ff88&gt;

的未定义局部变量或方法`tag_list'

2 个答案:

答案 0 :(得分:0)

我自己得到了它。 这是代码:

<%= 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

答案 1 :(得分:0)

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视图,您甚至可以告诉它渲染索引视图,因为您很可能已经有一个帖子列表,现在它看起来完全相同但只包含带有该标记的帖子。 e.g。

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