繁体   English   中英

Ruby on Rails:Helper方法将多个值返回到视图

[英]Ruby on rails: Helper method returns multiple values to views

我有一个帮助程序方法,它向视图返回大约10个值/变量。 如果我需要使用局部变量而不是帮助程序返回的实例变量,则在视图中调用此方法很麻烦。

我也不想为所有这些不同的值使用多个辅助方法,因为它将复制我的代码。

例如:example_helper.rb

  def multiple_return_values
    return a,b,c,d,e,f,g,h,i,j
  end

example_view.html.erb

  <% a,b,c,d,e,f,g,h,i,j = multiple_return_values %>

要么

  <% values = multiple_return_values %>
  <% values[0] %>
  <% values[1] %>
  .
  .
  .
  <% values[9] %>

我不想使用上述代码块(例如example_view.html.erb)。 我也不想使用来自帮助程序的实例变量。 我只想在视图中使用局部变量。

仅使用局部变量在视图中使用从助手返回的这些多个值的最佳方法是什么?

TLDR:如果返回的值很少,我的选择是解决方案1.1;如果返回的值很少,则选择解决方案1.2

解决方案1.1

def multiple_return_values
  # ...
  return {
    a: a,
    b: b,
    c: c,
    d: d,
    e: e,
    f: f,
    g: g,
    h: h,
    i: i,
    j: j
  }
end

解决方案1.2

或者,如果您希望解决方案1.1中不重复“键”和“值”,则:

def multiple_return_values
  # ...
  local_variables_to_be_returned = [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j]
  return Hash[local_variables_to_be_returned.map{|v| [v, binding.local_variable_get(v)]}]
end

用法

然后在您看来

<% returned_values = multiple_returned_values -%>

<%= returned_values[:a] %>
<%= returned_values[:b] %>
<%= returned_values[:g] %>

解决方案2

参见@HankPhung的评论:返回一个OpenStruct实例而不是Hash ,那么您只需使用OpenStruct.new(HASH)

def multiple_return_values
  # ...
  local_variables_to_be_returned = [:a, :b, :c, :d, :e, :f, :g, :h, :i, :j]
  return OpenStruct.new(
    Hash[local_variables_to_be_returned.map{|v| [v, binding.local_variable_get(v)]}]
  )
end

用法

然后在您看来

<% returned_values = multiple_return_values -%>

<%= returned_values.a %>
<%= returned_values.b %>
<%= returned_values.g %>

解决方案3

不建议; 仅针对特定情况使用

您可以直接传递binding作为返回值

def multiple_return_values_binding
  # ...
  return binding
end

用法

然后在您看来

<% somebinding = multiple_return_values_binding -%>

<%= somebinding.local_variable_get(:a) %>
<%= somebinding.local_variable_get(:b) %>
<%= somebinding.local_variable_get(:g) %>

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM