Reputation: 724
I'm using acts_as_taggable_on v.2.0.3 in Rails 3 to add tags to posts. I add a tag cloud as described here: https://github.com/mbleigh/acts-as-taggable-on, but I'm encountered an error: ActionController::RoutingError in Posts#index: No route matches {:action=>"tag", :id=>"politics", :controller=>"posts"}. My code is below:
PostHelper:
module PostsHelper
include TagsHelper
end
Model Post:
class Post < ActiveRecord::Base
...
acts_as_taggable_on :tags
end
PostController
class PostController < ApplicationController
...
def tag_cloud
@tags = Post.tag_counts_on(:tags)
end
end
View:
<% tag_cloud(@tags, %w(css1 css2 css3 css4)) do |tag, css_class| %>
<%= link_to tag.name, { :action => :tag, :id => tag.name }, :class => css_class %>
<% end %>
Routes.rb:
Blog::Application.routes.draw do
root :to => "posts#index"
resources :posts do
member do
post :notify_friend
end
collection do
get :search
end
resources :comments
end
resources :users
resource :session
match '/login' => "sessions#new", :as => "login"
match '/logout' => "sessions#destroy", :as => "logout"
end
What am i doing wrong? Thanks for your answers.
Upvotes: 6
Views: 1439
Reputation: 22939
For Rails4 @muki_rails approach did not work. This is what I did:
In routes.rb
:
get 'tags/:tag' => 'articles#index', as: 'tag'
Now I can do this in the view (I am using slim):
- @article.tags.each do |tag|
= link_to tag.name, tag_path(tag.name)
Then in my ArticlesController
if the params[:tag]
variable is set, I search for all corresponding articles that match the given task.
def index
if params[:tag].present?
@articles = Article.published.tagged_with(params[:tag])
else
@articles = Article.published
end
end
Upvotes: 0
Reputation: 724
Hmm, i think i understand. First, i edited routes.rb in a such way:
resources :posts do
...
collection do
get :tag
end
end
Second, i added method "Tag" in the PostController:
def tag
@posts = Post.tagged_with(params[:id])
@tags = Post.tag_counts_on(:tags)
render :action => 'index'
end
It works!
Upvotes: 7