2011-02-17 3 views
2

J'utilise acts_as_taggable_on stéroïdes et j'ai problème avec ce morceau de code qui génère un lien vers un tag:Rails link_to avec acts_as_taggable_on_steroids

<%= link_to tag, tag_path(:id => tag.name) %> 

quand j'accéder à l'URL:

http://localhost:3000/tags/rails 

J'obtiens l'erreur:

No action responded to rails. Actions: show 

Cependant, cette URL fonctionne:

http://localhost:3000/tags/show/rails 

J'ai défini l'action show dans mon tags_controller.rb

class TagsController < ApplicationController 
    def show 
    @stories = Story.find_tagged_with(params[:id]) 
    end 
end 

Je les routes suivantes générées par rake: itinéraires:

  tags GET /tags(.:format)        {:controller=>"tags", :action=>"index"} 
       POST /tags(.:format)        {:controller=>"tags", :action=>"create"} 
     new_tag GET /tags/new(.:format)       {:controller=>"tags", :action=>"new"} 
     edit_tag GET /tags/:id/edit(.:format)     {:controller=>"tags", :action=>"edit"} 
      tag GET /tags/:id(.:format)       {:controller=>"tags", :action=>"show"} 
       PUT /tags/:id(.:format)       {:controller=>"tags", :action=>"update"} 
       DELETE /tags/:id(.:format)       {:controller=>"tags", :action=>"destroy"} 

donc je sais que les balises d'URL/rails pointe vers les balises route /: id, et j'ai fourni un paramètre supplémentaire à link_to pour assigner le nom de balise en tant que: id, mais comme vous pouvez le voir, cela ne fonctionne pas. Un forum a suggéré que j'utilise le to_param mais je n'ai pas de modèle de balise et le livre a suggéré contre. Est-ce que je manque quelque chose?

Je suis la livre Sitepoint Rails simplement 2

EDIT: ajouté URL de travail, voir en haut

Répondre

0

Essayez d'ajouter ceci à votre ressource d'itinéraire:

:requirements => { :id => /.*/ } 
0

Prise de vue dans l'obscurité ici mais devrait

<%= link_to tag, tag_path(:id => tag.name) %>

être

<%= link_to tag, tag_path(:id => tag.id) %>

ou

<%= link_to tag, tag_path(tag) %>

0

Essayez ceci pour votre lien:

link_to tag.name, { :action => :tag, :id => tag.name } 

Je ne sais pas quelle version de rails vous J'utilise, je suppose 3.

Fondamentalement, vous utilisez le tag_path qui disparaît de l'id. Si vous n'avez rien changé, cela signifie quelque chose comme tag/43, tag avec l'identifiant 43. La raison pour laquelle vous avez été suggéré de remplacer to_param est dans le cas où vous voulez que le nom du tag soit remplacé par quelque chose comme tag/rails. Pour cela, vous faire quelque chose comme ceci:

class Tag 
    def to_param 
    name 
    end 
end 

Enfin, vous devrez changer l'action show d'utiliser le nom, et non pas l'id. Donc @stories = Story.find_tagged_with(params[:name]).Ensuite, je crois que vous voulez créer un itinéraire pour compenser cela, donc au-dessus de votre resources :tags, ajoutez match "/tags/:name" => "tags#show".

0

Pour moi, il ressemble à la différence de routes.rb entre

resources :tags 

et

resource :tags 

Le premier aura pour son action index par défaut, le second pas: index, mais il répondra avec show sur l'itinéraire par défaut.