Получение rails-api и strong_parameters для совместной работы

При включении

gem 'strong_parameters'
gem 'rails-api'

вместе в моем Gemfile, вызывая params.require как

private
  def user_params
    params.require(:user).permit(:first_name, :last_name)
  end

не удается выполнить следующую ошибку при вызове require().

TypeError:
   can't convert Symbol into String

Обратный ход показывает, что метод strong_parameters 'ActionController::StrongParameters' require() никогда не попадает.

Ответ 1

Я слишком долго занимался этим, поэтому решил, что поделился бы этим, надеюсь, что-то еще оставит немного времени.

Ошибка выше происходит из require() метода ActiveSupport::Dependencies::Loadable, выполняемого при вызове

params.require(:user)...

strong_parameters вводит ActionController::StrongParameters в ActionController::Base в нижней части этого файла с помощью

ActionController::Base.send :include, ActionController::StrongParameters

Драйвер rails-api требует вашего приложения ApplicationController extend ActionController::API в пользу ActionController::Base

Контроллеры приложений ничего не знают о ActionController::StrongParameters, потому что они не расширяют класс ActionController::StrongParameters. Вот почему вызов метода require() не вызывает реализацию в ActionController::StrongParameters.

Говорить ActionController::API about ActionController::StrongParameters так же просто, как добавить следующее в файл в config/initializers.

ActionController::API.send :include, ActionController::StrongParameters

Ответ 2

Эта проблема может быть решена путем включения rails_api master git branch в ваш Gemfile, как показано ниже:

gem 'rails-api', git: 'https://github.com/rails-api/rails-api.git', branch: 'master'

rails_api gem исправил эту проблему , включив следующие строки в api.rb

if Rails::VERSION::MAJOR == 4
   include StrongParameters
end

Ответ 3

У меня есть запрос pull (в настоящее время открыт), который должен исправить это поведение. Вместо вызова ActionController::API.send это должно быть включено с...

ActiveSupport.on_load(:action_controller) do
  include ActionController::StrongParameters
end