有没有更好的方法来检查儿童参数?

Joh*_*ard 5 ruby parameters ruby-on-rails

有没有比以下代码更好的方法来检查items_attributes?我必须先检查params [:order],因为有时可能不存在,但我讨厌长条件的外观。

if params[:order] and params[:order][:items_attributes]
Run Code Online (Sandbox Code Playgroud)

Ruby 2.3的更新,现在可以使用dig方法

params.dig(:order, :item_attributes)
Run Code Online (Sandbox Code Playgroud)

Vla*_*vic 1

您可以创建辅助方法,以便更轻松地使用嵌套哈希。在 lib 文件夹中创建 ruby​​_ext.rb 文件,并编写以下函数:

module RubyExt
  module SafeHashChain
    def safe(*args)
      if args.size == 0 then self # Called without args ...
      elsif args.size == 1 then self[args[0]] # Reached end
      elsif self[args[0]].is_a?(Hash) then self[args[0]].safe(*args[1..-1])
      else nil end # Reached end-value too soon
    end
  end
end

class Hash; include RubyExt::SafeHashChain; end
Run Code Online (Sandbox Code Playgroud)

之后,您可以对嵌套哈希调用安全方法,如下所示:

params.safe(:order,:items_attributes)
Run Code Online (Sandbox Code Playgroud)

它将返回 items_attributes 的值。如果 order 或 items_attributes 不存在,它将返回 nil。