在我的一位助手中,如果用户在个人资料上,我必须有所不同。帮助器返回一个充满URL的数组。
def get_options(profile)
if profile
url_arr = profile_infinite_path(user, ...)
# .
# .
# do stuff with profile_infinite_path
else
url_arr = infinite_path(user, ...)
# .
# .
# do same stuff with infinite_path
end
end
我想让这段代码更干,所以我的计划是将路径存储为变量,然后只调用所有剩余的代码一次。
def get_options(profile)
if profile
var_path = profile_infinite_path
else
var_path = infinite_path
end
url_arr = var_path(user, ...)
# .
# .
# do stuff with var_path
end
我也尝试将路径存储为方法,但没有运气。
var_path = profile_infinite_path.method
答案 0 :(得分:3)
这里有两种选择。由于路径助手是方法,并且只需通过声明方法就可以在没有参数的情况下调用方法,因此像path = profile_inifite_path
这样的赋值会给出方法调用的结果。
您可以通过使用符号来引用该方法来延迟调用,然后在需要时将其作为消息发送:
var_path = :profile_infinite_path
# ...
send(var_path, user, ...)
符号是send
的第一个参数,后面跟着你给该方法的任何参数。
另一种处理方法是将方法调用包装在proc中并在需要时调用它:
var_path = ->(*args){ profile_infinite_path(*args) }
# ...
var_path.call(user, ...)
在这种情况下,我倾向于选择send
。
答案 1 :(得分:1)
只在变量中存储符号,例如
var_path = :profile_infinite_path
然后你可以发送send(var_path,other_args)来获取真实的URL。 例如,如果您有用户:
var_path = :user_path
send(var_path, 2)
会返回"/users/2"
答案 2 :(得分:1)
在ruby中,您可以将if-else表达式的结果分配给变量。这允许您调用所需的方法并分配结果,如下所示:
url_arr = if profile
profile_infinite_path(user, ...)
else
infinite_path(user, ...)
end
# .
# .
# do stuff with url_arr