Ruby "exists && ==" 的快捷方式

Ruby shortcut to "exists && =="

我有这行代码,它根据是否存在现有用户来定义new_params

new_params = params[:existing_user] && params[:existing_user] == "1" ?
  existing_user_params(nested_donation_params) :
  nested_donation_params

很长。有没有这样的方法可以让它更短更干净?

e.exists_and_equals("1")

这里有几件事要记住。首先是你可以直接比较:

params[:existing_user] == "1"

如果这是 nil == "1" 那么它将 return false 无论如何。我首选的处理结构是:

case (params[:existing_user])
when "1"
  existing_user_params(nested_donation_params)
else
  nested_donation_params
end

现在,根据 existing_user_params 的情况,您可能有办法进一步简化此过程。例如,如果 existing_user_params 是辅助方法:

def existing_user_params
  case (params[:existing_user])
  when "1"
    fetch_existing_user_params
  else
    { }
  end
end

那么就可以消去分支了:

new_params = existing_user_params.merge(nested_donation_params)

Ruby v2.3.0 引入 Hash#dig。这允许您替换

params[:existing_user] && params[:existing_user]

params.dig(:existing_user)

例如,

params = { existing_user: "Hank" } 

params.dig(:existing_user)     #=> "Hank"
params.dig(:non_existent_user) #=> "Nil"

如果我们有

params = { a: { b: "Dotty" } }

我们可以写

params.dig(:a, :b) #=> "Dotty"
params.dig(:c, :b) #=> nil
params.dig(:a, :c) #=> nil

v2.3.0也给了我们Array#dig.