我resources :tags
中有routes.rb
。
因此,当我转到/tags/ios
时,它会向我显示正确的Tag#Show
视图。
我想要发生的是,当用户转到/tags/ios
时,它会将其显示为/ios
,同样我希望生成的路径始终为/ios
(并且没有领先/tags
)。
以下是我在each
块中呈现该链接的示例:
<%= link_to "#{tag.name}", url_for(tag) %>
答案 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}")
答案 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}}