Ruby的快捷方式为“exists&& ==”

时间:2016-05-19 23:25:40

标签: ruby refactoring

我有这行代码,根据是否有现有用户定义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")

2 个答案:

答案 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