2010-05-11 17 views
7

Rails yolları, RESTful stili '/' bir URL'nin bitlerini eşleştirmek için idealdir, ancak sorgu parametrelerini map.connect yapılandırmasında eşleştirebilir. '?''dan sonra bir parametrenin varlığına bağlı olarak farklı denetleyicileri/eylemleri çağırmak istiyorum. o params karma denetleyiciye kullanılabilir sürece ben, parametresinin değeri umurumda değil yönlendirme amaçları içinRails, rotaları eşleşen sorgu parametreleriyle eşleştiriyor

Böyle bir şey çalışıyordu ...

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' 

+1

Bu muhtemelen ile yapmak gerçekten zor olacak yerleşik bunun nedeni motoru yönlendirme sadece İsteğin yol kısmı ile ilgilenir. Sorgu parametreleri başka bir katman tarafından ayrıştırılır. Yönlendirilebilir yapmak için URL'yi yeniden yazarken, Rack'u kullanmak mümkün olabilir. – tadman

cevap

1

Bunu değiştirememenin somut bir nedeni olmadıkça, neden sadece dinlenmeye çekmiyorsunuz? Birçok parametreler varsa sizin parametreler url tarafından maruz gerekmez böylece

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

, neden POST veya PUT kullanılmasın?

10

Aşağıdaki çözüm, "Dış Kısma Yönlendirme Yönlendirme Rayları" kılavuzunun "Gelişmiş Kısıtlamalar" bölümüne dayanmaktadır (http://guides.rubyonrails.org/routing.html).

config/routes.rb dosyanızda bir tanıyıcı sınıfının bir eşleşme var mı? yöntem, örneğin:

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

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

Sonra olduğu gibi, yönlendirme kısıtlamaları olarak sınıftan nesneler kullanın:

map.connect "api/my/path", :contraints => FruitRecognizer.new(:apple), :controller => 'apples_controller', :action => 'my_action' 
İlgili konular