【问题标题】:How to remove empty parameters from params hash?如何从参数哈希中删除空参数?
【发布时间】:2014-09-16 09:04:20
【问题描述】:

在我的 Rails 4 应用程序中,我有这样的设置:

class InvoicesController < ApplicationController

  def index
    @invoices = current_user.invoices.search(params)
  end

  ...

end

class Invoice < ActiveRecord::Base

  belongs_to :user

  def self.search(params)
    data = all
    data = data.where("number LIKE ?", "%#{params[:number]}%") if params[:number]
    data = data.where("total > ?", params[:minimum]) if params[:minimum]
    data = data.where("total < ?", params[:maximum]) if params[:maximum]
    data
  end

  ...

end

问题是我有一堆其他的 GET 参数,它们都是 params 哈希的一部分。如何从 URL 中删除空白参数,这样我就不会得到如下 URL:

/invoices?after=&before=&maximum=&minimum=&number=

感谢您的帮助。

【问题讨论】:

  • 澄清一下,您是说提交表单时,不希望通过URL提交空字段吗?如果是这样,您可能需要在提交之前使用JS拦截表单并删除空白内容。

标签: ruby-on-rails ruby activerecord


【解决方案1】:

把这个放在哈希之后:

.reject{|_, v| v.blank?}

【讨论】:

  • 为了清楚起见:您将把代码放在哪里?
  • @Tintin81在要过滤的控制器中调用 params 的任何地方使用此代码。例如User.create(params[:user].reject{|_, v| v.blank?}) 更好的用法是在模型内部,无论是在设置器上还是作为保存前的回调方法。
【解决方案2】:

Rails 6.1+

Rails 6.1 将 compactcompact! 添加到 ActionController::Parameters 以便从 params 哈希中删除 nil 值。

params.compact

params.compact!

这是link to PR


Rails 6.1 将 compact_blankcompact_blank! 添加到 ActionController::Parameters 以便从 params 哈希中删除 blank 值。

params.compact_blank

params.compact_blank!

这是link to PR

Examples of blank values:

nil, '', ' ', [], {}, false

【讨论】:

    【解决方案3】:

    @Marian13 的回答是正确的。作为补充,在有人陷入参数方法的兔子洞之前,以下是一个理智的保护者。

    【讨论】:

      猜你喜欢
      • 2020-01-20
      • 1970-01-01
      • 1970-01-01
      • 2013-01-25
      • 2018-12-08
      • 1970-01-01
      • 2015-06-16
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多