2010-06-01 26 views

Trả lời

25

Theo mặc định, các phân đoạn động không chấp nhận chấm - đây là vì chấm được sử dụng như một dấu phân cách cho các tuyến đường được định dạng. Tuy nhiên, bạn có thể thêm một số yêu cầu regex vào các tham số tuyến đường. Ở đây, bạn muốn cho phép các dấu chấm trong các tham số.

match 'some_action/:id' => 'controller#action', :constraints => { :id => /[0-z\.]+/ } 

Và trong đường ray 2.3:

map.connect 'some_action/:id', :controller => 'controller', :action => 'action', :requirements => { :id => /[0-z\.]+/ } 

Relevent rails guides section

+0

giải pháp Cuối cùng Rails3 làm việc! Cảm ơn. – lzap

4

Trong Rails 4 tôi đã sử dụng:

get 'operation/:p1/:p2', to: 'operation#get', constraints: { p1: /[^\/]+/, p2: /[^\/]+/ } 

nó cho phép bất kỳ nhân vật trong cả hai params (trừ '/')

+1

Tính năng này cũng hoạt động với các url không phải là latin! – kadrian

1

Và khi được sử dụng với nguồn ký hiệu, nó có thể được thực hiện như thế này:

resources :post, 
       only: [ :create, :index, :destroy ], 
       constraints: { id: /[0-z\.]+/ } 

Tested trong Rails 4.1

0

Chúng tôi đã có trường hợp tương tự khi chúng ta loại bỏ một số phần của một con đường api. Về cơ bản chúng tôi đã đi /api/app/v1/*-/api/v1/*

Chúng tôi đặt điều này trong các tuyến của chúng tôi

match '/api/app/v1/*path', to: redirect(path: '/api/v1/%{path}'), via: :all 

Đây là tất cả tốt, ngoại trừ đối với một số tuyến đường kết thúc bằng con đường params bao gồm dấu chấm. Ví dụ. /api/v1/foo/00.00.100 trong đó .100 được phân tích cú pháp thành format và thông số còn lại chỉ có giá trị 00.00

Chúng tôi đã bảo vệ điều này với một số ràng buộc về thông số.

put '/api/app/v1/foo/:version', 
    constraints: { version: /([0-9]+)\.([0-9]+)\.([0-9]+)/ }, 
    to: redirect('/api/v1/foo/%{version}') 

Edit: chúng tôi sử dụng đường ray 5

Các vấn đề liên quan