2014-07-02 143 views
1

我有资源,看起来像这样:轨道4 select_tag嵌套资源

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

每个Team可以有多个Posts这在它的回合可以有多个Tags。在我的团队秀视图中,我想显示select_tag,其中列出了TeamPosts的所有标签。当用户选择一个标签时,我想重定向它们并列出该标签的所有帖子。我已经开始工作了,但不是用我的嵌套资源和我想要的URLs。我的实现目前看起来是这样的(我用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 

这工作,但让我看起来像这样的网址:

teams/1?utf8=✓&tag=1 

我要的是:

teams/1/tags/tag-name 

这是可能做到的,看起来会如何?

+0

这是路由的问题:[阅读](HTTP ://guides.rubyonrails.org/routing.html) – dax

+0

谢谢,我认为路线是正确的。在另外一个地方,我使用'link_to'将用户重定向到'teams/1/tags/tag-name',它可以工作。但我不知道如何用我的'select_tag'来做到这一点。 – Anders

+0

啊,好吧!我的错误:) – dax

回答

1

基于this answer,你也许能够得到这个工作:

= 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);"} 

我不知道的唯一的事情是,如果@team.id将正确插值内:onchange,所以你也可以尝试改变onchange行这样的:

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

谢谢,这工作。由@rneves回答我用名称作为值而不是id。 – Anders

1

尝试使用,或像这样(与你的字段)控制器

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

上和选择你要使用的名称为值,也许像这样

tag.name.gsub(" ", "-") 
一个GSUB