Định tuyến với Dấu gạch ngang `-` Thay vì Dấu gạch dưới` _` trong Ruby on Rails


88

Tôi muốn các url của mình sử dụng dấu gạch ngang -thay vì gạch dưới _làm dấu phân tách từ. Ví dụ controller/my-actionthay vì controller/my_action.

Tôi ngạc nhiên về hai điều:

  1. Google và cộng sự. tiếp tục phân biệt chúng.
  2. Đó Ruby on Rails không có một đơn giản, thông số cấu hình toàn cầu để lập bản đồ -để _trong định tuyến. Hay không?

Giải pháp tốt nhất tôi là sử dụng :ashoặc một tuyến đường được đặt tên.

Ý tưởng của tôi là sửa đổi định tuyến Rails để kiểm tra cấu hình chung đó và thay đổi -thành _trước khi gửi đến một hành động điều khiển.

Có cách nào tốt hơn?


Tôi cũng thích dấu gạch ngang để gạch dưới trong url (cũng như trong id phần tử html / css, tên và lớp), nhưng tôi chưa cố gắng triển khai nó. Tôi sẽ chuyển sang rails 3 trước và sau đó lo lắng về điều này vì rails 3 có rất nhiều nâng cấp mạnh mẽ cho phần mềm trung gian và định tuyến.
yfeldblum

Cảm ơn Công lý. Tôi sẽ tạm dừng cho đến khi tôi nâng cấp và làm quen với v3.
pduey

Xem bài viết này về đường gạch nối trong Rails
Yarin

Câu trả lời:


74

Với Rails 3 trở lên, bạn có thể làm như sau:

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

Một tùy chọn khác là sửa đổi Rails, thông qua một trình khởi tạo. Tuy nhiên, tôi không khuyến nghị điều này vì nó có thể bị hỏng trong các phiên bản sau (chỉnh sửa: không hoạt động trong Rails 5).

Sử dụng :pathnhư hình trên là tốt hơn.

# 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
Tôi là thương hiệu mới đối với Rails. Bạn sẽ thêm một dòng như thế này vào tệp nào?
Alan W. Smith

5
phải có một cách tốt hơn và nhanh hơn để chuyển đổi tất cả các tuyến đường có dấu gạch dưới thành dấu gạch nối
carbonr

2
@carbonr làm thế nào về ví dụ tôi vừa thêm vào? :)
sandstrom

@sandstrom đó là nó! ngọt!
carbonr

3
Đáng tiếc là bản vá khỉ này không còn hoạt động trong Rails 5. Điều này sẽ làm mất đi mọi thứ ngoại trừ #index và #create, những thứ này sẽ vẫn ở dạng gạch dưới và tạo ra các lỗi khó chịu. Nếu bất kỳ ai có tập lệnh cập nhật cho Rails 5, nó sẽ được đánh giá cao.
Kelsey Hannan

3

Bạn có thể quá tải bộ điều khiển và tên hành động để sử dụng dấu gạch ngang:

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

Bạn có thể kiểm tra trong bảng điều khiển:

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

2

Bạn có thể sử dụng các tuyến đường được đặt tên. Nó sẽ cho phép sử dụng '-' làm bộ tách từ. Trong route.rb,

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

Bây giờ các url như http: // my_application / abc sẽ chuyển đến bộ điều khiển và hành động được chỉ định.

Ngoài ra, để tạo url động

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

trong trường hợp này 'id1, id2 & id2 sẽ được chuyển dưới dạng http params cho hành động

Trong các hành động và quan điểm của bạn,

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

sẽ đánh giá thành url ' http: // my_application / val1-val2-val3 '.


3
Tôi muốn tránh việc bảo trì định tuyến theo cách thủ công, vì vậy các tuyến được đặt tên đã bị loại bỏ. Tôi chỉ muốn định tuyến đường ray thay thế cho tôi bán buôn và giữ chặt chẽ các tệp cấu hình của tôi.
pduey

2

nếu bạn sử dụng dấu gạch dưới trong bộ điều khiển và xem tệp thì chỉ cần sử dụng dấu gạch ngang trong tệp định tuyến của bạn và nó sẽ hoạt động ..

lấy 'blog / example-text' đây là lộ trình của tôi cho bộ điều khiển này

def example_text end <- đây là bộ điều khiển của tôi

và example_text.html.erb là tệp

và đây là liên kết thực tế site.com/blog/example-text

tôi nhận ra điều này phù hợp với tôi và nó hiệu quả hơn là nhấn mạnh sự khôn ngoan của SEO

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.