Как мне разрешить параметры для идемпотентных действий (например, индексировать, редактировать и показывать)? - PullRequest
0 голосов
/ 08 января 2019

В моем файле просмотра я реализовал AJAX, который отправляет идемпотентный запрос GET на следующий обработанный URL:

resources_path(:param1 => "value1", :param2 => "value2", :param3 => "value3", :paramN => "valueN")

Когда я получаю доступ к странице просмотра, я получаю ошибку ActionController::UnfilteredParameters in Resources#index, которая исходит от Сильные параметры .

Я думаю, что решение состоит в том, чтобы разрешить вышеуказанное params в ResourcesController ниже, но как должно Я делаю это для действия индекса, поскольку действие индекса обычно не требует параметров (в отличие, например, от создать или обновить)? Есть лучшая практика для этого?


Контроллер следующий:

class ResourcesController < ApplicationController
  def index
    respond_to do |format|
      format.html
      format.js
    end
  end
end

1 Ответ

0 голосов
/ 08 января 2019

Вы можете внести в белый список параметры для любого действия точно таким же образом:

Foo.new( params.require(:foo).permit(:bar) )
# or for a flat hash
Foo.new( params.permit(:foo, :bar) )

Хэш params - это просто объект, похожий на хеш, имеющий флаг permitted. Вызов .permit возвращает новый экземпляр ActionController::Parameters, содержащий только разрешенные ключи и с разрешенным флагом, установленным в true.

Но это неправильный ответ на неправильный вопрос.

Эта проблема не связана с внесением в белый список параметров в индексе, редактированием и отображением параметров, а скорее в том, что ваше приложение использует параметры для создания / обновления моделей из GET-запроса в первую очередь.

Все маршруты действий по индексированию, редактированию и показу соответствуют запросам GET, которые должны быть идемпотентными (они вообще не должны изменять ресурсы). Это особенно важно, поскольку они сохраняются в истории браузеров, что может привести к неожиданным последствиям, если пользователь нажмет кнопку «Назад».

           Prefix Verb   URI Pattern                                                                              Controller#Action
           things GET    /things(.:format)                                                                        things#index
                  POST   /things(.:format)                                                                        things#create
        new_thing GET    /things/new(.:format)                                                                    things#new
       edit_thing GET    /things/:id/edit(.:format)                                                               things#edit
            thing GET    /things/:id(.:format)                                                                    things#show
                  PATCH  /things/:id(.:format)                                                                    things#update
                  PUT    /things/:id(.:format)                                                                    things#update
                  DELETE /things/:id(.:format)                                                                    things#destroy

Хотя методы GET могут принимать параметры, они, как правило, не должны выполнять какого-либо массового присвоения модели.

Только белые действия create и update, которые соответствуют неидемпотентным методам POST и PUT|PATCH, должны относиться к созданию белого списка параметров. Вы должны убедиться, что ваш ajax-вызов отправляется по правильному пути и использует правильный метод HTTP.

...