Отключить сильные параметры для конкретного действия
У меня есть серьезная проблема с сильными параметрами. Он работает очень хорошо в моих 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])