2016-05-03 2 views
9

Rails 5.0.0.beta4 ввел предупреждение устаревания о маршрутах, содержащих динамические: действие и сегменты: Контроллер:Рельсы 5.1 Маршрутов: динамическое: Действие параметры

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 состояние:

, учитывающее: контроллер и: значения действий, заданные по пути в config/routes.rb, были основной причиной ряда проблем в Rails, которые привели к выпуску безопасности. В свете этого лучше, чтобы контроллеры и действия явно были помещены в белый список , а не пытались занести в черный список или дезинфицировать «плохие» значения.

Как бы вы сделали «белый список» набора параметров действия? У меня есть следующие в моем файле маршрутов, которые поднимают предупреждение устаревания:

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

Очевидный ответ, кажется, явно определить каждое действие, но это кажется громоздким в контроллер со многими пользовательскими действиями. Возможно, это лучшая практика, так или иначе, n'est-ce pas? – mysmallidea

ответ

15

Хотя это немного громоздким, лучший подход, как представляется, явно определить маршруты:

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

Просто небольшой комментарий. В 'get action, action: action' вы можете оставить действие, так как Rails по умолчанию использует действие с тем же именем, что и get. Таким образом, 'get action' достаточно. –

0

Он работает как это:

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

Это именно то, что было устарело. –

+0

@JamesMoore Есть ли какая-либо документация об устаревших –

+0

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

3

не тот же случай, как вы, но я сделал это:

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

Маршрутов:

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

Я полагаю, что если я хочу, вложенный путь, который я буду использовать *:

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

Да, я выбрал решение, очень похожее на это. Однако есть ли проблемы с безопасностью в этом? Один странный побочный эффект заключается в том, что теперь вы можете частично посетить страницу. Например. если у вас есть 'views/pages/_sidebar.html.erb', вы можете теперь посетить'/_sidebar' – Obversity

+0

Этот подход может быть небезопасным - http://brakemanscanner.org/docs/warning_types/dynamic_render_paths/ –

+0

@BradWerth Мне известно такой код может быть небезопасным, но в этом случае статья не дает примера, 'params [: path]' является строкой, она будет искать путь соответствия файла – juanpastas

Смежные вопросы