我有一个帮助方法,它返回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,如果loooooads返回值
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.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] %>
请参阅@ 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 %>
不建议;只是特定于案例的用法
您可以直接传入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) %>