2011-03-17 88 views
67

我希望我的网址使用短划线-而不是下划线_作为单词分隔符。例如controller/my-action而不是controller/my_action在Ruby on Rails中使用短划线`-`而不是下划线`_`

我很惊讶两两件事:

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

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

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

有没有更好的方法?

+0

我也喜欢破折号在URL中下划线(以及在HTML/CSS元素ID,名称和类),但我还没有尝试实现它。我会首先迁移到rails 3,然后担心这个问题,因为rails 3对中间件和路由有很大的升级。 – yfeldblum 2011-03-17 18:40:59

+0

感谢正义。我会延期,直到升级并熟悉v3。 – pduey 2011-03-23 15:57:07

回答

55

使用Rails 3和以后你可以这样做:

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

另一种选择是修改的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 
+1

我是Rails的新手。你会添加一条这样的文件到哪个文件中? – 2012-02-20 15:15:19

+0

请参阅本指南:http://guides.rubyonrails.org/routing.html – sandstrom 2012-02-21 17:20:45

+3

必须有一个更好更快的方式来将所有具有undersore的路线转换为连字符 – carbonr 2013-03-31 17:59:32

2

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

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

现在的URL像http://my_application/a-b-c会去指定的控制器和动作。

此外,用于创建动态URL

map.name_of_route 'id1-:id2-:id3',  :controller => 'my_controller', :action => "my_action" 
在这种情况下

“ID1,ID2 & ID2会为http PARAMS被传递到操作

在你的行动和观点,

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

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

+2

我想避免路由的手动维护,所以命名的路由已经结束。我只是想要轨道路由做批发的替代品,并保持我的配置文件紧张。 – pduey 2011-03-23 16:00:59

1
如果使用下划线在控制器和视图文件,然后只需使用破折号在你的路由文件,它会工作

..

得到“博客/例如文本”这是我这条路控制器

高清EXAMPLE_TEXT 结束< - 这是我的控制器

和example_text.html.erb是文件

,这是实际的链接网站。COM /博客/例如文本

我想这是我的作品,而不是强调SEO它更有效明智

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 
相关问题