我有这行代码,根据是否有现有用户定义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")
答案 0 :(得分:4)
这里要记住几件事。首先,你可以直接比较:
variable_local_get
variable_local_array_get
如果这是params[:existing_user] == "1"
,则无论如何都会返回nil == "1"
。处理此问题的首选结构是:
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
答案 1 :(得分:2)
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。