【问题标题】:Rails check if params exist in the controllerRails 检查控制器中是否存在参数
【发布时间】:2017-08-25 14:01:05
【问题描述】:

我有一个 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

但在上面每当我尝试传递 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 不存在,它们都会抛出相同的错误。有没有办法在不因缺少参数而引发错误的情况下进行测试?

【问题讨论】:

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


    【解决方案1】:

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

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

    根据您的用例,您也可以直接在params 上使用params.permit(:primary)。有关如何使用 ActionController::Parametersparams 的类)的详细信息,请参阅 API 文档。

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

    【讨论】:

    • 是的,这很有意义,我忽略了我需要在 params 上进行测试的事实,因为在这种情况下根本不存在 primary_factor_params
    • @Fire Lancer 谢谢!我刚刚遇到了一种情况,我必须有条件地设置一个基本变量来查找使用不同关系的关联记录,具体取决于请求关联记录的模型,这非常有效!
    【解决方案2】:

    您可以通过params[:primary].present? 检查您的参数是否存在 我认为这是最简单的方法

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-16
      • 1970-01-01
      • 2016-08-25
      • 2013-08-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多