【问题标题】:Routes with Dash `-` Instead of Underscore `_` in Ruby on Rails在 Ruby on Rails 中使用 Dash `-` 而不是下划线 `_` 的路由
【发布时间】:2011-07-17 02:36:19
【问题描述】:

我希望我的网址使用破折号 - 而不是下划线 _ 作为单词分隔符。例如controller/my-action 而不是controller/my_action

我对两件事感到惊讶:

  1. 谷歌等。继续区分它们。
  2. Ruby on Rails 没有简单的全局配置参数来将路由中的- 映射到_。或者是吗?

我的最佳解决方案是使用:as 或命名路由。

我的想法是修改 Rails 路由以检查该全局配置并将- 更改为_,然后再调度到控制器操作。

有没有更好的办法?

【问题讨论】:

  • 我也更喜欢 url 中的破折号而不是下划线(以及 html/css 元素 ID、名称和类),但我还没有尝试实现它。我会先迁移到 rails 3,然后再担心这个问题,因为 rails 3 对中间件和路由进行了很多重大升级。
  • 感谢正义。我会等到我升级并熟悉 v3 之后。
  • 查看这篇关于Hyphenated Routes in Rails的文章

标签: ruby-on-rails routing rails-routing


【解决方案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 更有效

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 2015-09-12
      • 1970-01-01
      • 1970-01-01
      • 2011-02-15
      • 2011-10-26
      • 1970-01-01
      相关资源
      最近更新 更多