90

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

我对两件事感到惊讶:

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

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

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

有没有更好的办法?

4

4 回答 4

81

使用 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
于 2011-10-17T18:48:09.247 回答
5

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

# 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
于 2017-07-23T11:58:35.153 回答
2

您可以使用命名路由。它将允许使用“-”作为单词分隔符。在 routes.rb 中,

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

现在像http://my_application/abc这样的 url将转到指定的控制器和操作。

此外,用于创建动态网址

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 '。

于 2011-03-17T16:50:04.873 回答
2

如果您在控制器和视图文件中使用下划线,那么只需在您的路由文件中使用破折号,它就会起作用..

获取 'blog/example-text' 这是我的控制器路线

def example_text end <-- 这是我的控制器

和 example_text.html.erb 是文​​件

这是实际的链接 site.com/blog/example-text

我认为这对我有用,而且它比强调 SEO 更有效

于 2017-01-02T04:42:08.753 回答