我resources :tags
在我的routes.rb
.
所以当我去的时候/tags/ios
,它向我展示了正确的Tag#Show
观点。
我想要发生的是当用户转到/tags/ios
它时将其显示为/ios
,同样我希望生成的路径始终是/ios
(而不是领先的/tags
)。
这是我如何在each
块中呈现该链接的示例:
<%= link_to "#{tag.name}", url_for(tag) %>
我resources :tags
在我的routes.rb
.
所以当我去的时候/tags/ios
,它向我展示了正确的Tag#Show
观点。
我想要发生的是当用户转到/tags/ios
它时将其显示为/ios
,同样我希望生成的路径始终是/ios
(而不是领先的/tags
)。
这是我如何在each
块中呈现该链接的示例:
<%= link_to "#{tag.name}", url_for(tag) %>
那么这里的问题是命名空间
如果你定义一个像
得到 "/(:slug)" => "标签#show"
这将基本上匹配任何其有效标签与否的东西。我会这样做的方式是
在您的路线文件中:
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?
在你的 routes.rb
resources :tags
match '/:tag_name' => 'tags#show'
然后在您的 tags_controller#show 操作中,您可以通过以下方式访问标签名称:
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}")
所以即使我从这些人那里得到了很多很好的建议,我还是找到了我认为对我来说最好的解决方案。
我所要做的基本上就是在所有标签的链接上的实际 URL 和 URL 栏中都/tags/ruby
呈现为。/ruby
我不想做任何会增加我的应用程序负载的事情。
这是对我有用的解决方案:
resources :tags, path: "", except: [:index, :new, :create]
使用path:
,您可以指定要显示的路径。即你想在你的资源之前出现什么。因此,如果您希望您的 URL 看起来像myhotness/tags/ruby
,那么您只需这样做path: "myhotness"
。
我不想在我的路上有任何东西,所以我把它留空了。
对于它的价值,您甚至可以向该路线添加约束,如下所示:
resources :tags, path: "", except: [:index, :new, :create], constraints: { :id => /.*/ }