2016-05-03 12 views
9

Rails 5.0.0.beta4 eine deprecation Warnung auf Strecken enthält dynamische eingeführt: Aktion und: controller Segmente:Schienen 5.1 Routes: dynamisch: Aktionsparameter

DEPRECATION WARNING: Using a dynamic :action segment in a route is deprecated and will be removed in Rails 5.1. 

The commit message from this PR Zustände:

Zulassen: Controller und: Aktionswerte, die über den Pfad in config/routes.rb angegeben werden müssen, waren die Ursache für eine Reihe von Problemen in Rails, die zu Sicherheitsupdates geführt haben. In Anbetracht dieser ist es besser, dass Controller und Aktionen explizit Whitelists sind, anstatt zu versuchen, "schlechte" Werte auf die schwarze Liste zu setzen oder zu bereinigen.

Wie würden Sie eine Reihe von Aktionsparametern "auf die weiße Liste setzen"? Ich habe folgendes in meinen Routen-Datei, die die deprecation Warnung heben:

namespace :integrations do 
    get 'stripe(/:action)', controller: 'stripe', as: "stripe" 
    post 'stripe/deactivate', controller: 'stripe', action: 'deactivate' 
end 
+0

Die offensichtliche Antwort jede Aktion zu sein scheint, um explizit zu definieren, aber dies in einem umständlichen scheint Controller mit vielen benutzerdefinierten Aktionen. Vielleicht ist das sowieso eine gute Praxis, n'est-ce pas? – mysmallidea

Antwort

15

Obwohl es etwas umständlich ist, scheint der beste Ansatz zu sein, um explizit die Routen zu definieren:

namespace :integrations do 
    namespace 'stripe' do 
    %w(auth webhook activate).each do |action| 
     get action, action: action 
    end 
    end 
    post 'stripe/deactivate', controller: 'stripe', action: 'deactivate' 
end 
+0

Nur ein kleiner Kommentar. In 'get action, action: action' können Sie die Aktion weglassen, da Rails standardmäßig die Aktion mit dem gleichen Namen wie get verwendet. So ist "Handeln" ausreichend. –

0

Es funktioniert dies wie:

 
get 'stripe(/:action)', controller: 'stripe', action: :action, as: "stripe" 
+1

Genau das ist veraltet. –

+0

@JamesMoore Gibt es Dokumentation über die veraltete –

+0

@FrankFang https://github.com/rails/rails/issues/27231#issuecomment-304650177 –

3

Ist das nicht der gleiche Fall wie Sie, aber ich habe dies:

class PagesController < ApplicationController 
    def index 
    render params[:path] 
    end 
end 

Routen:

get ':path', to: 'pages#index' 

Ich nehme an, wenn ich ein verschachtelter Weg will ich * verwenden:

get '*path', to: 'pages#index' 
+0

Ja, ich wählte eine Lösung sehr ähnlich zu diesem. Gibt es irgendwelche Sicherheitsbedenken, dies zu tun? Ein seltsamer Nebeneffekt ist, dass Sie jetzt die Seite für eine teilweise besuchen können. Z.B. Wenn Sie 'views/pages/_sidebar.html.erb' haben, können Sie jetzt'/_sidebar' aufrufen – Obversity

+0

Dieser Ansatz kann unsicher sein - http://brakemanscanner.org/docs/warning_types/dynamic_render_paths/ –

+0

@BradWerth Mir ist bekannt Diese Art von Code könnte unsicher sein, aber in diesem Fall gibt Artikel kein Beispiel, 'params [: Pfad]' ist eine Zeichenfolge, es wird nur nach einer Datei mit passendem Pfad gesucht – juanpastas