Rails检查控制器中是否存在params

时间:2017-08-25 14:01:05

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

我有一个factor控制器,它为两种不同类型的因子提供因子值

  1. 主要因素
  2. 次要因素
  3. 我将它们作为参数传递如下:

    class FactorController < AdminController
    
      def create
        if primary_factor_params                              ## LINE 5
          do something
        elsif secondary_factor_params
          do something else
        end
      end
    
      def primary_factor_params
        params.require(:primary).permit(:user_id,            ## LINE 70
                                               :primary_factors)
      end
    
      def secondary_factor_params
        params.require(:secondary).permit(:user_id,
                                            :secondary_factors)
      end
    end
    

    但是在上面每当我尝试传递secondary_factor时,我都会收到以下错误:

    ActionController::ParameterMissing (param is missing or the value is empty: primary):
      app/controllers/factors_controller.rb:70:in `primary_factor_params'  app/controllers/api/v1/admin/factors_controller.rb:5:in `create'
    

    所以对我来说,这个错误似乎即将到来,因为在这种情况下我没有primary_factor_params的任何值,而且由于第一个if条件,它会抛出错误。

    我试过了:

    primary_factor_params.exists?
    primary_factor_params.has_key?(:primary_factors)
    ....
    

    但由于primary_factor_params不存在,所有人都抛出同样的错误。有没有办法测试这个而不会丢失错误的参数?

2 个答案:

答案 0 :(得分:5)

问题是此行params.require(:primary)表示该参数是必需的,因此如果您根本没有params.require(:primary).exists?参数,那么尝试像:primary这样的操作将无法帮助您,因为{ {1}}已经失败。

您需要检查require本身的存在。例如params

根据您的使用情况,您也可以直接在params.has_key?(:primary)上使用params.permit(:primary)。有关如何使用params({1}}的类)的详细信息,请参阅API文档。

http://api.rubyonrails.org/classes/ActionController/Parameters.html#method-i-permit

答案 1 :(得分:1)

您可以通过Expanded检查您的情况下参数的存在 我认为这是最简单的方法