在 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 在Ruby on Rails中阻止别名

在 Ruby on Rails 中使用 fork 创建并行进程

何时在 Ruby on Rails 中使用 memoization

在 Ruby on Rails 上使用 javascript 注入 ruby