【问题标题】:Ruby on rails: Helper method returns multiple values to viewsRuby on rails:帮助方法向视图返回多个值
【发布时间】:2018-03-05 06:17:00
【问题描述】:

我有一个帮助方法,可以将大约 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] %>

我不想使用上面的这些代码块(例如_view.html.erb)。我也不想使用来自助手的实例变量。我只想在视图中使用局部变量。

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

【问题讨论】:

  • 另一种方法是你可以返回打开的结构实例并通过my_struct = multiple_return_values然后my_struct.xmy_struct.ymy_struct.z...

标签: ruby-on-rails helper


【解决方案1】:

TLDR:如果返回值很少,我的偏好是Solution 1.1,如果返回值太多,我的偏好是Solution 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) %>

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-03-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-21
    • 1970-01-01
    • 2011-06-22
    相关资源
    最近更新 更多