我有一个帮助程序方法,它向视图返回大约 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) %>