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

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

有两件事我很惊讶:

  1. 谷歌等继续区分他们。
  2. RubyonRails 没有一个简单的全局配置参数来在路由中将 -映射到 _。真的吗?

最好的解决方案是使用 :as或命名路线。

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

还有更好的办法吗?

20975 次浏览

You can use named routes. It will allow using '-' as word seperators. In routes.rb,

map.name_of_route     'a-b-c',       :controller => 'my_controller', :action => "my_action"

Now urls like http://my_application/a-b-c would go to specified controller and action.

Also, for creating dynamic urls

map.name_of_route    'id1-:id2-:id3',       :controller => 'my_controller', :action => "my_action"

in this case 'id1, id2 & id2 would be passed as http params to the action

In you actions and views,

name_of_route_url(:id1=>val1, :id2=>val2, :id3=>val3)

would evaluate to url 'http://my_application/val1-val2-val3'.

With Rails 3 and later you can do like this:

resources :user_bundles, :path => '/user-bundles'

Another option is to modify Rails, via an initializer. I don't recommend this though, since it may break in future versions (edit: doesn't work in Rails 5).

Using :path as shown above is better.

# 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

if you use underscores in a controller and view file then just use dashes in your routes file, and it will work..

get 'blog/example-text' this is my route for this controller

def example_text end <-- this is my controller

and example_text.html.erb is the file

and this is the actual link site.com/blog/example-text

i figured this is works for me, and it's more effective than underscores SEO wise

You can overload controller and action names to use dashes:

# config/routes.rb
resources :my_resources, path: 'my-resources' do
collection do
get 'my-method', to: :my_method
end
end

You can test in console:

rails routes -g my_resources
my_method_my_resources GET  /my-resources/my-method(.:format) my_resources#my_method