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

ano*_*432 1 ruby ruby-on-rails strong-parameters ruby-on-rails-4

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

  1. 主要因素
  2. 次要因素

我将它们作为参数传递如下:

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
Run Code Online (Sandbox Code Playgroud)

但是在上面我试图传递一个时,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'
Run Code Online (Sandbox Code Playgroud)

所以对我来说似乎这个错误正在出现,因为我primary_factor_params在这种情况下没有任何值,并且由于第一个if条件,它会抛出错误.

我试过了:

primary_factor_params.exists?
primary_factor_params.has_key?(:primary_factors)
....
Run Code Online (Sandbox Code Playgroud)

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

Fir*_*cer 5

问题是这条线params.require(:primary)说该参数是必需的,所以params.require(:primary).exists?如果你根本没有参数那么试图做就不会帮助你:primary,因为require已经失败了.

你需要检查它params本身的存在.例如params.has_key?(:primary).

根据您的使用情况,您也可以params.permit(:primary)直接使用params.有关如何ActionController::Parameters(params可用于类)的详细信息,请参阅API文档.

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