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.
我有这行代码,它根据是否存在现有用户来定义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.