2010-05-11 27 views
7

Các tuyến đường ray là tuyệt vời để phù hợp với các kiểu URL được phân tách trong một cấu hình map.connect. Tôi muốn các bộ điều khiển/hành động khác nhau được gọi tùy thuộc vào sự hiện diện của tham số sau '?'.Các tuyến đường ray phù hợp với các tham số truy vấn

Tôi đã cố gắng một cái gì đó như thế này ...

map.connect "api/my/path?apple=:applecode", :controller => 'apples_controller', :action => 'my_action' 
map.connect "api/my/path?banana=:bananacode", :controller => 'bananas_controller', :action => 'my_action' 

Đối với mục đích định tuyến Tôi không quan tâm đến giá trị của tham số, miễn là nó có sẵn với bộ điều khiển trong params băm

+1

này có lẽ sẽ được thực sự khó khăn để làm với việc xây dựng trong công cụ định tuyến bởi vì nó chỉ giao dịch với phần đường dẫn của yêu cầu. Các tham số truy vấn được phân tích bởi một lớp khác. Có thể sử dụng Rack để viết lại URL khi nó đến để làm cho nó có thể định tuyến được. – tadman

Trả lời

1

Trừ khi có một lý do cụ thể tại sao bạn không thể thay đổi điều này, tại sao không chỉ làm cho nó yên tĩnh?

map.connect "api/my/path/bananas/:id, :controller => "bananas_controller", :action => "my_action"

Nếu bạn có nhiều thông số, tại sao không sử dụng một POST hoặc một PUT để thông số của bạn không cần phải được tiếp xúc bởi url?

10

Giải pháp sau đây dựa trên phần "Hạn chế nâng cao" của hướng dẫn đường ray "Định tuyến đường ray từ bên ngoài" (http://guides.rubyonrails.org/routing.html).

Trong tệp config/routes.rb của bạn, bao gồm lớp trình nhận dạng có khớp không? phương pháp, ví dụ:

class FruitRecognizer 
    def initialize(fruit_type) 
    @fruit_type = fruit_type.to_sym 
    end 

    def matches?(request) 
    request.params.has_key?(@fruit_type) 
    end 
end 

Sau đó sử dụng các đối tượng từ các lớp như hạn chế định tuyến, như trong:

map.connect "api/my/path", :contraints => FruitRecognizer.new(:apple), :controller => 'apples_controller', :action => 'my_action' 
Các vấn đề liên quan