Rails - 在动作控制器参数上调用方法

时间:2017-03-10 19:21:10

标签: ruby-on-rails ruby

我正在尝试实施以下讨论中的方法,以便从我的强参数中删除所有空白字段。

class Hash
  def delete_blank
    delete_if{|k, v| v.empty? or v.instance_of?(Hash) && v.delete_blank.empty?}
  end
end

p hash.delete_blank
# => {"y"=>"content"}

How to recursively remove all keys with empty values from (YAML) hash?

这是location_params,我想从中删除空字段:

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

当我在 location_params

上调用以下 delete_blank 方法时会触发以下错误
undefined method "delete_blank" for #<ActionController::Parameters:0x007.....>

我的意见是我必须修改我的 Rails项目中的哈希类,但我不知道怎么做,我想它可能不是最佳方案。

非常感谢你的帮助 的Fabrizio

1 个答案:

答案 0 :(得分:4)

Rails params方法返回的结构看起来像一个哈希,但实际上它是ActionController::Parameters的一个实例。

由于delete_blank未定义ActionController::ParametersHash未定义undefined method "delete_blank" for #<ActionController::Parameters...,因此出现此错误:ActionController::Parameters

您有两种选择:

A)在class ActionController::Parameters def delete_blank delete_if{|k, v| v.empty? or v.instance_of?(Hash) && v.delete_blank.empty?} end end 上定义方法:

ActionController::Parameters

或者B)将Hash的实例翻译成ActionController::Parameters.new(params.to_h.delete_blank).permit! ,调用该方法并将其翻译回来:

                new sap.ui.layout.form.FormElement(this.createId('valor'),{
                label: 'Valor',
                fields: [
                    new sap.m.Input({
                         value:{
                            parts: [{
                                        path: '/valor'
                                    },
                                    {
                                        path: 'BRL'
                                    }
                                ],
                                type: 'sap.ui.model.type.Currency',
                                formatOptions: {
                                showMeasure: false
                                }
                            },
                        id: this.createId('txtValor')
                    }),
                ]
            }),