2014-04-25 13 views
8

Ich versuche, den Rails-Params-Hash aus einem benutzerdefinierten Rack-Middleware-Objekt einen Wert hinzuzufügen. Mein aktueller Ansatz wird mitAlter Rails Params-Hash von Rack-Middleware

class PortalResolver 

def initialize(app) 
    @app = app 
end 

    def call(env) 
    begin 
     url = "#{env['rack.url_scheme']}://#{env['HTTP_HOST']}" 
     request = Rack::Request.new(env) 
     portal_id = DomainService.domain(url) # DomainService is returning the expected value 
     request.params['portal_id'] = portal_id 
     status, headers, response = @app.call(env) 
     [status, headers, response] 
    rescue PortalNotFoundError => e 
     [403, {'Content-Type' => 'text/html'}, ['']] 
    end 
    end 
end 

ich zur Zeit Hinzufügen der Middleware nach ActionDispatch :: ParamsParser. Die Parameter werden nicht in den Rails-Params-Hashs von einem Controller angezeigt, sondern erscheinen im request.params-Hash (innerhalb des oben definierten Middleware-Objekts). Irgendwelche Ideen? Hilfe sehr geschätzt.

+1

so erstellen Sie ein 'request' Objekt aber dann tun Sie nichts mit ihm? Wie soll das im Controller aussehen? – phoet

Antwort

13

Die docs for Rack::Request#params sagen:

Beachten Sie, dass Änderungen nicht in der env beibehalten werden. Verwenden Sie update_param oder delete_param, wenn Sie Parameter destruktiv ändern möchten.

Wenn Sie die Linie

request.params['portal_id'] = portal_id 

verwenden Sie die neuen Parameter an dem für diese Instanz von Rack-:: Anfrage erstellt Hash hinzufügen, aber die env, die an Schienen geführt wird, wird nicht verändert. Um den neuen Wert zur Verfügung weiter macht nach unten der Rack-Stack verwendet update_param wie die docs vorschlagen:

request.update_param('portal_id', portal_id) 
+1

Das war es! Definiert definitiv die Wichtigkeit, die Dokumente genau zu lesen. – silatham99