如何将此路线重写为更短?

时间:2013-03-29 20:03:30

标签: ruby-on-rails ruby-on-rails-3 routes

resources :tags中有routes.rb

因此,当我转到/tags/ios时,它会向我显示正确的Tag#Show视图。

我想要发生的是,当用户转到/tags/ios时,它会将其显示为/ios,同样我希望生成的路径始终为/ios(并且没有领先/tags)。

以下是我在each块中呈现该链接的示例:

<%= link_to "#{tag.name}", url_for(tag) %>

3 个答案:

答案 0 :(得分:0)

这里的问题是命名空间

如果您定义类似

的路线

获取“/(:slug)”=&gt; “标签#秀”

基本上匹配任何有效标签的东西。我会这样做的方式是

路线文件中的

  begin  
    Tag.all.each do |t|
      begin
        get "#{t.slug}" => "Tags#show"
      rescue
      end
    end
  rescue
  end

然后在你的标签控制器中你可以

 def show
    slug = request.env['PATH_INFO']
    @tag = Tag.find_by_slug(slug)
  end

我的回答来自我写的另一个答案,您可能感兴趣How to create app-wide slug routing for Rails app?

答案 1 :(得分:0)

在你的routes.rb

resources :tags
match '/:tag_name' => 'tags#show'

然后在您的tags_controller#show action中,您可以通过以下方式访问标记名称:

params[:tag_name]

请务必将其放在路径文件的末尾,因为它会捕获所有内容。此外,因为如果它不是有效的标签名称,它将捕获所有应该呈现404的所有内容:

def show
    unless @tag = Tag.where(name: params[:tag_name]).first
        raise ActionController::RoutingError.new('Not Found')
    end
end

将/ tags / ruby​​重定向到/ ruby​​:

match "/tags/:tag_name" => redirect("/%{tag_name}")

http://guides.rubyonrails.org/routing.html

答案 2 :(得分:0)

所以即使我从这些人那里得到了很多很好的建议,我发现我认为对我来说是最好的解决方案。

我尝试做的只是将/tags/ruby渲染为/ruby,在所有代码的链接上的实际网址和网址栏中都显示为resources :tags, path: "", except: [:index, :new, :create]

我不想做任何会增加我的应用程序负载的事情。

这是适合我的解决方案:

path:

使用myhotness/tags/ruby,您可以指定要显示路径的内容。即你想在资源之前出现什么?因此,如果您希望自己的网址看起来像path: "myhotness",那么您只需执行resources :tags, path: "", except: [:index, :new, :create], constraints: { :id => /.*/ }

我在路上不想要任何东西,所以我把它留空了。

对于它的价值,您甚至可以为该路线添加约束,如下所示:

{{1}}