在 Ruby on Rails 中使用 Dash `-` 而不是下划线 `_` 的路由
Posted
技术标签:
【中文标题】在 Ruby on Rails 中使用 Dash `-` 而不是下划线 `_` 的路由【英文标题】:Routes with Dash `-` Instead of Underscore `_` in Ruby on Rails 【发布时间】:2011-07-17 02:36:19 【问题描述】:我希望我的网址使用破折号 -
而不是下划线 _
作为单词分隔符。例如controller/my-action
而不是controller/my_action
。
我对两件事感到惊讶:
-
谷歌等。继续区分它们。
Ruby on Rails 没有简单的全局配置参数来将路由中的
-
映射到_
。或者是吗?
我的最佳解决方案是使用:as
或命名路由。
我的想法是修改 Rails 路由以检查该全局配置并将-
更改为_
,然后再调度到控制器操作。
有没有更好的办法?
【问题讨论】:
我也更喜欢 url 中的破折号而不是下划线(以及 html/css 元素 ID、名称和类),但我还没有尝试实现它。我会先迁移到 rails 3,然后再担心这个问题,因为 rails 3 对中间件和路由进行了很多重大升级。 感谢正义。我会等到我升级并熟悉 v3 之后。 查看这篇关于Hyphenated Routes in Rails的文章 【参考方案1】:使用 Rails 3 及更高版本,您可以这样做:
resources :user_bundles, :path => '/user-bundles'
另一种选择是通过初始化程序修改 Rails。 不过我不推荐这样做,因为它可能会在未来的版本中中断(编辑:在 Rails 5 中不起作用)。
如上图使用:path
更好。
# Using private APIs is not recommended and may break in future Rails versions.
# https://github.com/rails/rails/blob/4-1-stable/actionpack/lib/action_dispatch/routing/mapper.rb#L1012
#
# config/initializers/adjust-route-paths.rb
module ActionDispatch
module Routing
class Mapper
module Resources
class Resource
def path
@path.dasherize
end
end
end
end
end
end
【讨论】:
我是 Rails 的新手。你会在哪个文件中添加这样的一行? 必须有一种更好更快的方法来将所有有下划线的路线转换为连字符 @carbonr 我刚刚添加的示例怎么样? :) @sandstrom 就是这样!甜! 遗憾的是,这个猴子补丁在 Rails 5 中不再有效。这将破坏除#index 和#create 之外的所有内容,它们将保留为下划线并产生令人讨厌的错误。如果有人有 Rails 5 的更新脚本,将不胜感激。【参考方案2】:您可以重载控制器和动作名称以使用破折号:
# config/routes.rb
resources :my_resources, path: 'my-resources' do
collection do
get 'my-method', to: :my_method
end
end
您可以在控制台中测试:
rails routes -g my_resources
my_method_my_resources GET /my-resources/my-method(.:format) my_resources#my_method
【讨论】:
【参考方案3】:您可以使用命名路由。它将允许使用“-”作为单词分隔符。在 routes.rb 中,
map.name_of_route 'a-b-c', :controller => 'my_controller', :action => "my_action"
现在像http://my_application/a-b-c 这样的网址将转到指定的控制器和操作。
另外,用于创建动态网址
map.name_of_route 'id1-:id2-:id3', :controller => 'my_controller', :action => "my_action"
在这种情况下,'id1、id2 和 id2 将作为 http 参数传递给操作
在你的行动和观点中,
name_of_route_url(:id1=>val1, :id2=>val2, :id3=>val3)
将评估为 url 'http://my_application/val1-val2-val3'。
【讨论】:
我想避免手动维护路由,所以命名的路由都出来了。我只想让 Rails 路由完全替代我并保持我的配置文件紧凑。【参考方案4】:如果您在控制器和视图文件中使用下划线,那么只需在您的路由文件中使用破折号,它会起作用..
get 'blog/example-text' 这是我的控制器路由
定义示例文本 end
example_text.html.erb 是文件
这是实际的链接 site.com/blog/example-text
我认为这对我有用,而且它比强调 SEO 更有效
【讨论】:
以上是关于在 Ruby on Rails 中使用 Dash `-` 而不是下划线 `_` 的路由的主要内容,如果未能解决你的问题,请参考以下文章
思考Ruby On Rails的底层代码(Ruby on Rails 開發秘籍 | Ruby on Rails 快速入門)
如何注销 Facebook - 在 Rails 应用程序中使用代码(Ruby on Rails Omniauth)
在 Ruby on Rails 中使用 fork 创建并行进程