路由使用Dash`-`而不是Ruby on Rails中的Underscore`_`

pdu*_*uey 81 routing ruby-on-rails rails-routing

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

我对两件事感到惊讶:

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

我将使用的最佳解决方案:as或命名路线.

我的想法是修改Rails路由以检查该全局配置并在分派到控制器操作之前更改-_.

有没有更好的办法?

san*_*rom 67

使用Rails 3及更高版本,您可以这样做:

resources :user_bundles, :path => '/user-bundles'
Run Code Online (Sandbox Code Playgroud)

另一种选择是通过初始化程序修改Rails.我不推荐这个,因为它可能在将来的版本中破坏.

使用: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
Run Code Online (Sandbox Code Playgroud)

  • 必须有一种更好,更快的方法将所有下划线路由转换为连字符 (3认同)
  • @carbonr我刚刚添加的例子怎么样?:) (2认同)
  • 遗憾的是,该猴子补丁不再在Rails 5中起作用。这将使除#index和#create之外的所有内容都破译,这将保留为下划线并产生令人讨厌的错误。如果有人拥有Rails 5的更新脚本,将不胜感激。 (2认同)

Lev*_*sky 5

您可以重载控制器和操作名称以使用破折号:

# config/routes.rb
resources :my_resources, path: 'my-resources' do
  collection do
    get 'my-method', to: :my_method
  end
end
Run Code Online (Sandbox Code Playgroud)

您可以在控制台中测试:

rails routes -g my_resources
my_method_my_resources GET  /my-resources/my-method(.:format) my_resources#my_method
Run Code Online (Sandbox Code Playgroud)