2014-07-02 2 views
1

j'ai une ressource qui ressemble à ceci:Rails 4 select_tag avec des ressources imbriquées

resources :teams do 
    [...] 
    get 'tags/:tag', to: "teams#show", as: :tag 
end 

Chaque Team peut avoir plusieurs Posts qui lui est tour peut avoir plusieurs Tags. Dans mes équipes montrent vue je veux afficher un select_tag qui répertorie tous les tags pour Posts. Lorsque l'utilisateur sélectionne un tag, je souhaite le rediriger et lister tous les articles de ce tag. Je vais aller travailler, mais pas avec ma ressource imbriquée et le URLs que je veux. Ma mise en œuvre ressemble actuellement à ceci (j'utilise HAML):

/ View 
= form_tag team_path(@team), method: 'get', class: 'tag_form' do 
    .input-group 
    = select_tag "tag", options_from_collection_for_select(@team_tags, 'id', 'name', params[:tag]), prompt: "All tags", class: 'chosen-select' 

# Controller 

def show 

    @team_tags = @team.posts.tag_counts_on(:tags) 

    if params[:tag] && !params[:tag].blank? 
    tag = Tag.find(params[:tag]) 
    @posts = @team.posts.tagged_with(tag.name) 
    else 
    @posts = @team.posts 
    end 

end 

Cela fonctionne, mais me donne une url qui ressemble à ceci:

teams/1?utf8=✓&tag=1 

Ce que je veux est:

teams/1/tags/tag-name 

Est-ce possible, et à quoi cela ressemblerait-il?

+0

c'est un problème de routage: [lire] (http : //guides.rubyonrails.org/routing.html) – dax

+0

Merci, je pense que les routes sont correctes. Dans un autre endroit, j'utilise 'link_to' pour rediriger les utilisateurs vers' teams/1/tags/tag-name', ce qui fonctionne. Mais je ne suis pas sûr de savoir comment le faire avec mon 'select_tag'. – Anders

+0

ah, d'accord! mon erreur :) – dax

Répondre

1

Basé sur this answer, vous pourriez être en mesure d'obtenir ce travail:

= select_tag "tag", 
    options_from_collection_for_select(@team_tags, 
    'id', 
    'name', 
    params[:tag]), 
    {prompt: "All tags", 
    class: 'chosen-select'}, 
    {onchange: "window.location.replace('/teams/' + @team.id + '/tags/' + this.value);"} 

la seule chose que je ne suis pas sûr est de savoir si @team.id sera correctement interpolées à l'intérieur :onchange, donc vous pouvez également essayer de changer la ligne onchange à ceci:

onchange: "window.location.replace('/teams/#{@team.id}/tags/' + this.value);" 
+0

Merci, cela a fonctionné. Comme par @rneves, j'ai utilisé le nom comme valeur au lieu de id. – Anders

1

Essayez d'utiliser, ou quelque chose comme ça (avec vos champs) sur le contrôleur

tag = Tag.where("id = ? OR name = ?", params[:tag], params[:tag]) 

Et sur la sélection, vous devez utiliser le nom en tant que valeur, peut-être avec un gsub comme celui-ci

tag.name.gsub(" ", "-") 
Questions connexes