Rails - 从嵌套属性中删除空字段的强params

时间:2017-03-11 18:29:32

标签: ruby-on-rails ruby

我已经在这行代码上工作了三天。 我有以下强大的参数:

def location_params
  params.require(:location).permit(:country, {:ads_attributes => [:remote, :days]})
end

方法 param_clean 将从 location_params 中删除空字段,但它不适用于嵌套的:ads_attributes 。 主要原因是 param_clean 只能在具有类 ActiveController :: Parameters location_params 上调用。我无法使用 v 方法 param_clean

def param_clean
    location_params.delete_if{  |k, v| v.empty? or v.instance_of?(ActionController::Parameters) && v.param_clean.empty? }
end 

我收到以下错误

undefined method `param_clean' for #<ActionController::Parameters:0x007f..>

这是location_params

的值
<ActionController::Parameters {"country"=>"", "ads_attributes"=><ActionController::Parameters {"remote"=>"0", "days"=>""} permitted: true>} permitted: true>

这是触发错误时v变量的值

<ActionController::Parameters {"remote"=>"0", "days"=>""} permitted: true>

v.class => ActionController::Parameters

该方法不适用于嵌套参数。 非常感谢您的帮助

最诚挚的问候 的Fabrizio

1 个答案:

答案 0 :(得分:2)

问题是param_clean类中没有定义ActionController::Parameters方法。所以,你必须改变你的方法:

  • 扩展ActionController::Parameters以包含该方法(不是我建议的方法)。
  • 重构方法。一种方法如下:

    def param_clean(_params)
      _params.delete_if do |k, v|
        if v.instance_of?(ActionController::Parameters)
          param_clean(v)
        end
        v.empty?
      end
    end
    
    # how to use it
    param_clean(location_params)