Routes with Dash `-` Instead of Underscore `_` in Ruby on Rails

前端 未结 4 1053
别那么骄傲
别那么骄傲 2020-12-04 18:33

I want my urls to use dash - instead of underscore _ as word separators. For example controller/my-action instead of controller/

相关标签:
4条回答
  • 2020-12-04 19:12

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

    0 讨论(0)
  • 2020-12-04 19:18

    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
    
    0 讨论(0)
  • 2020-12-04 19:24

    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

    0 讨论(0)
  • 2020-12-04 19:33

    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
    
    0 讨论(0)
提交回复
热议问题