【问题标题】:Rails - Calling a Method on Action Controller ParametersRails - 在动作控制器参数上调用方法
【发布时间】:2017-03-10 19:21:09
【问题描述】:

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

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 项目中修改 Hash Class,但我不知道该怎么做,我认为它可能不是最佳解决方案。

非常感谢您的帮助 法布里奇奥

【问题讨论】:

    标签: ruby-on-rails ruby


    【解决方案1】:

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

    由于delete_blank 未在ActionController::Parameters 上定义,但在Hash 上您会收到此错误:undefined method "delete_blank" for #&lt;ActionController::Parameters...

    你有两个选择:

    A) 在ActionController::Parameters上定义方法:

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

    或B)将ActionController::Parameters的实例翻译成Hash,调用该方法并将其翻译回来:

    ActionController::Parameters.new(params.to_h.delete_blank).permit!
    

    【讨论】:

    • 很好的答案!非常感谢!
    猜你喜欢
    • 1970-01-01
    • 2011-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多