在特定的控制器方法上切换“ActionController :: Parameters.action_on_unpermitted_pa​​rameters =:raise”?

时间:2017-12-07 10:44:14

标签: ruby-on-rails ruby-on-rails-5 strong-parameters

我想用

ActionController::Parameters.action_on_unpermitted_parameters = :raise

要引发异常,会传入未经许可的参数,但我只想在特定的控制器方法上执行此操作,而不是在/ config /中设置它并将其应用于整个环境。有没有办法这样做?

2 个答案:

答案 0 :(得分:2)

我不确定Wasif的答案能否正常运作,因为它永远不会回复。我认为你至少想要这个:

class SomeController < ApplicationController
  around_action :raise_action_on_unpermitted_parameters, only: %i[create update]

  def index
    # ...
  end

  def create
    # ...
  end

  def update
    # ...
  end

  private

  def raise_action_on_unpermitted_parameters
    begin
      ActionController::Parameters.action_on_unpermitted_parameters = :raise
      yield
    ensure
      ActionController::Parameters.action_on_unpermitted_parameters = :log
    end
  end
end

即便如此,我也不确定你是否会遇到竞争条件,如果你正在使用像Puma这样的多线程服务器,它会不小心引发不同的控制器操作。

答案 1 :(得分:0)

Filters救援!

您可以在控制器中定义包含params设置的私有方法,并在before过滤器中调用该方法以执行特定操作。

E.g。要在create:update操作上引发例外,您可以执行以下操作:

class SomeController < ApplicationController
  before_action :raise_action_on_unpermitted_parameters, only: %i[create update]

  def index
    # ...
  end

  def create
    # ...
  end

  def update
    # ...
  end

  private

  def raise_action_on_unpermitted_parameters
    ActionController::Parameters.action_on_unpermitted_parameters = :raise
  end
end