Отключить сильные параметры для конкретного действия

У меня есть серьезная проблема с сильными параметрами. Он работает очень хорошо в моих 200 действиях, но в одном он не потому, что я работаю очень динамично с параметрами, и я также не могу его изменить из-за дизайна приложений.

Поэтому я хочу отключить сильную проверку параметров только в этом конкретном действии. Есть ли способ сделать это?

Ответ 1

Сильные параметры переопределяют метод params в ActionController::Base. Вы можете просто переопределить его и вернуть обратно к тому, что вы хотите.

Итак, это:

class MyController < ApplicationController
  def params
    request.parameters
  end
end

Будет эффективно отключать сильные параметры для всех действий в вашем контроллере. Вы только хотели отключить его для определенного действия, хотя вы могли бы сделать это с помощью:

class MyController < ApplicationController
  before_action :use_unsafe_params, only: [:particular_action]

  def params
    @_dangerous_params || super
  end

  def particular_action
    # My params is unsafe
  end

  def normal_action
    # my params is safe
  end

  private

  def use_unsafe_params
    @_dangerous_params = request.parameters
  end
end

Ответ 2

Вы можете использовать .permit! для белого списка любых ключей в хеше.

params.require(:something).permit!

Однако это следует рассматривать как чрезвычайный запах кода и риск для безопасности.

Вложенные хэши могут быть добавлены в белый список с помощью этого трюка:

params.require(:product).permit(:name, data: params[:product][:data].try(:keys))

Ответ 3

Не слишком уверен, что это лучшая практика, но для Rails 5 я просто использую request.params вместо params когда хочу пропустить сильные params.

Так что вместо чего-то вроде:

post = Post.new(params[:post])

Я использую:

post = Post.new(request.params[:post])