检查“零”字符串的干净方法

时间:2019-10-09 14:23:17

标签: ruby-on-rails ruby string

在一种情况下,我正在专门寻找值为String的{​​{1}}。简而言之,如果用户在下拉菜单中选择了该选项而不传递"nil",那么我就有条件要传递nil,这是在参数中传递的内容:

我的选择:

"nil"

我的状况:

<select name="parent_id"> 
  <option name="All">All</option>
  <option name="None" value="nil">None</option>
</select>

通常,您将在if params[ :parent_id ].present? Child.where( parent_id: params[ :parent_id ] ) # I want this to be IS NULL when params[ :parent_id ] == "nil" end 上使用.nil?.blank?来检查String的值或空的nil。但是String"nil".nil?都应该等于"nil".blank?

因此,我很好奇是否存在一种检查false是否为String的好方法。

当前我正在使用"nil",但这会导致类似myString == "nil"的情况。

( myString == "nil" ? nil : myString )

偶尔使用它是很好的,但是如果经常使用它,那是不理想的。

我知道这种情况很少见,但是对于Google来说特别困难,所以我想问一下。

我最初的想法是:

  • if params[ :parent_id ].present? parent_id = params[ :parent_id ] == "nil" ? nil : params[ :parent_id ] Child.where( parent_id: parent_id ) end 添加方法,以便您可以执行类似String的操作。
  • 猴子补丁"nil".nil_literal? #=> true,以便.presence?返回"nil".presence?而不是nil

2 个答案:

答案 0 :(得分:1)

我建议将选择内容更改为:

  <option name="None" value="">None</option>

如果您做不到,我将不给猴子打补丁。

您可以在条件中添加"nil"检查:

if params[ :parent_id ].present? && params[ :parent_id != 'nil' 
  Child.where(parent_id: params[:parent_id]))
end

或者您可以使用单独的方法过滤params

def filtered_params
  @filtered_params |= params.tap{|p| p[:parent_id] = nil if p[:parent_id] == 'nil' }
end

并在控制器代码中使用filtered_params代替params

答案 1 :(得分:0)

这就是我要解决的方法

class Child 
  belongs_to :parent 

  scope :by_parent, ->(parent_id=nil) { 
    parent_id.to_i == 0 ? without_parent : where(parent_id: parent_id.to_i)
  }
  scope :without_parent, -> { where(parent_id: nil) } 
end 

那么您的控制器代码就是

 Child.by_parent(params[:parent_id])