在Ruby on Rails中使用破折号`-`而不是下划线`_`进行路由


88

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

我对两件事感到惊讶:

  1. Google等。继续区分它们。
  2. Ruby on Rails没有一个简单的全局配置参数可以映射-_路由中。还是呢?

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

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

有没有更好的办法?


我还更喜欢破折号而不是URL(以及html / css元素ID,名称和类)中的下划线,但是我没有尝试实现它。我会先迁移到Rails 3,然后再担心这一点,因为Rails 3对中间件和路由进行了大量的升级。
yfeldblum 2011年

感谢大法官。我会等到升级并熟悉v3为止。
pduey 2011年

请参阅这篇有关Rails中的
连带

Answers:


74

使用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

1
我是Rails的新手。您要在哪个文件中添加这样的行?
艾伦·史密斯

5
必须有一种更好,更快的方法来将所有未得到认可的路线转换为连字符
carbonr

2
@carbonr我刚刚添加的示例如何?:)
sandstrom 2014年

@sandstrom就是这样!甜!
carbonr 2014年

3
遗憾的是,该猴子补丁不再在Rails 5中起作用。这将使除#index和#create之外的所有内容都破译,这将保留为下划线并产生令人讨厌的错误。如果有人拥有Rails 5的更新脚本,将不胜感激。
Kelsey Hannan '18

3

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

# 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

2

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

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

现在,像http:// my_application / abc之类的网址将转到指定的控制器和操作。

另外,用于创建动态网址

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) 

将评估为网址“ http:// my_application / val1-val2-val3 ”。


3
我想避免手动维护路由,因此命名路由已淘汰。我只希望Rails路由为我批发,并保持我的配置文件紧密。
pduey 2011年

2

如果您在控制器中使用下划线并查看文件,则仅在路由文件中使用破折号即可。

获取“博客/示例文本”,这是我使用该控制器的路线

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

并且example_text.html.erb是文件

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

我认为这对我来说很有效,并且比强调SEO明智得多

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.