Rails 3 - routing error when using acts_as_taggable_on v.2.0.3
Asked Answered
A

2

6

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.

Affra answered 13/11, 2010 at 21:14 Comment(2)
Can you please post your routes.rb file?Columbus
I add routes.rb file into my question above.Affra
A
7

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!

Affra answered 14/11, 2010 at 8:23 Comment(0)
R
0

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
Roxyroy answered 26/5, 2016 at 9:39 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.