将变量存储在路径中

时间:2014-03-20 15:03:02

标签: ruby-on-rails ruby

在我的一位助手中,如果用户在个人资料上,我必须有所不同。帮助器返回一个充满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

3 个答案:

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