2011-02-03 18 views
14

he visto preguntas similares sobre esto, pero no es lo que estoy buscando ... Olvidando por un momento, la sabiduría de hacer esto, es posible que a hacer esto? ...rutas Configuración de Rieles basado en cadena de consulta

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

... y si es así, ¿cómo se haría eso?

+0

sólo ver las opciones redirect_ti en el controlador en este caso – apneadiving

Respuesta

3

Dejando a un lado la cuestión de si es prudente hacerlo, la respuesta a "¿es esto posible" es 'sí':

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 

Básicamente, el asignador de ruta puede aceptar cualquier aplicación Rack como criterio de valoración. Nuestra sencilla aplicación analiza la cadena de consulta, crea el nombre del controlador y llama al método ActionController action (que a su vez es una aplicación Rack). No se muestra: cómo tratar cadenas de consulta con cualquier formato que no sea 'o=<controller_name>'

+0

lo mejor que pueda dígale que esta es la única forma de "redirigir" sin tener el efecto secundario de tener su cadena de consulta eliminada. Gracias @zetetic – SooDesuNe

+2

En lugar de '.split' para llegar al punto de consulta, usaría:' Rack :: Utils.parse_nested_query (env ["QUERY_STRING"]) ' – SooDesuNe

16

Suponiendo que está utilizando Rails 3+, puede utilizar una "Restricción avanzada" (lea más sobre ellos en http://guides.rubyonrails.org/routing.html#advanced-constraints).

continuación se explica cómo resolver su ejemplo:

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

¿Dónde, en qué carpeta debe escribirse este módulo? Soy un novato en RoR. – inquisitive

11

más concisa que la respuesta @moonmaster9000 's por sólo routes.rb:

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" } 
Cuestiones relacionadas