2011-02-03 24 views
14

Tôi đã nhìn thấy câu hỏi tương tự về vấn đề này, nhưng không hoàn toàn những gì tôi đang tìm kiếm ... Quên cho một thời điểm khôn ngoan để làm điều này, nó là thể để làm điều này? ...Thiết lập Rails đường khác dựa trên QueryString

/object/update/123?o=section # ==> route to SectionController#update 
/object/update/456?o=question # ==> route to QuestionController#update 

... và nếu vậy, làm thế nào sẽ được thực hiện?

+0

Tôi chỉ thấy các tùy chọn redirect_ti trong bộ điều khiển trong trường hợp này – apneadiving

Trả lời

3

Thiết sang một bên câu hỏi liệu nó là khôn ngoan để làm như vậy, câu trả lời cho "có thể như vậy" là 'yes':

class QueryControllerApp 
    def self.call(env) 
    controller_name = env['QUERY_STRING'].split('=').last 
    controller = (controller_name.titleize.pluralize + "Controller").constantize 
    controller.action(:update).call(env) 
    rescue NameError 
    raise "#{controller_name} is an invalid parameter" 
    end 
end 

MyRailsApp::Application.routes.draw do 
    put 'posts/update/:id' => QueryControllerApp 
end 

Về cơ bản các tuyến đường mapper có thể chấp nhận bất kỳ ứng dụng rack như một thiết bị đầu cuối. Ứng dụng đơn giản của chúng tôi phân tích cú pháp chuỗi truy vấn, xây dựng tên bộ điều khiển và gọi phương thức ActionController action (chính nó là một ứng dụng Rack). Không được hiển thị: cách xử lý các chuỗi truy vấn với bất kỳ định dạng nào khác ngoài 'o=<controller_name>'

+0

Như tốt nhất mà tôi có thể cho biết đây là cách duy nhất để "chuyển hướng" mà không có tác dụng phụ của việc chuỗi truy vấn của bạn bị tước đi. Cảm ơn bạn @zetetic – SooDesuNe

+2

Thay vì '.split' để nhận được truy vấn sting, tôi sẽ sử dụng:' Rack :: Utils.parse_nested_query (env ["QUERY_STRING"]) ' – SooDesuNe

16

Giả sử bạn đang sử dụng Rails 3+, bạn có thể sử dụng "Hạn chế nâng cao" (đọc thêm về chúng tại http://guides.rubyonrails.org/routing.html#advanced-constraints).

Dưới đây là làm thế nào để giải quyết ví dụ của bạn:

module SectionConstraint 
    extend self 

    def matches?(request) 
    request.query_parameters["o"] == "section" 
    end 
end 

module QuestionConstraint 
    extend self 

    def matches?(request) 
    request.query_parameters["o"] == "question" 
    end 
end 

Rails.application.routes.draw do 
    match "/object/update/:id" => "section#update", :constraints => SectionConstraint 
    match "/object/update/:id" => "question#update", :constraints => QuestionConstraint 
end 
+0

Ở đâu, trong đó thư mục nên mô-đun này được viết? Tôi là một newbie để RoR. – inquisitive

11

ngắn gọn Hơn @moonmaster9000 's câu trả lời cho routes.rb chỉ:

match "/object/update/:id" => "section#update", 
    :constraints => lambda { |request| request.params[:o] == "section" } 
match "/object/update/:id" => "question#update", 
    :constraints => lambda { |request| request.params[:o] == "question" } 
Các vấn đề liên quan