尝试将对象存储在数组中以在视图中进行迭代。
在我的控制器中:
def expire
@search = Search.new(search_params)
if @search.valid?
@clients = []
@allClients = #value from REST API
@allClients.each do |client|
@clientele = Clientele.new
@clientele["exp"] = client.experience ##Also tried @clientele.exp = client.experience
@clientele["email"] = client.email ##Also tried @clientele.email = client.email
@clients.push(@clientele)
end
end
end
class Clientele
def exp
end
def email
end
end
在我看来,没有显示任何内容并显示@clients数组给出一个空数组:
<% @clients.each do |client| %>
<%= client.exp %>
<%= client.email %>
<% end %>
<%= clients %> #=> []
我不确定我做错了什么,我似乎无法创建一个临时对象来存储值并将其存储到数组中。任何帮助或建议都会有所帮助。
答案 0 :(得分:0)
您永远不会初始化@allClients
(至少在您提供的代码中)。因此,@allClients
为nil
而@allClients.each
不产生任何内容。
尝试更多类似的内容:
def expire
@search = Search.new(search_params)
if @search.valid?
@clients = Client.all.map do |client|
Clientele.new(
exp: client.experience,
email: client.email
)
end
end
end
使用map
返回由块结果填充的Array
(这是一个初始化的Clientele
对象)。
您是否要添加更多代码?我猜你是。因为,正如目前所写的那样,整个Clientele
实例化的东西似乎毫无意义。
您可以像这样制作您的Clientele课程:
class Clientele
def initialize(params={})
params.each do |k,v|
class_eval{attr_accessor k}
send("#{k}=",v)
end
end
end
然后你就能以我展示的方式实例化它。 class_eval
位创建getter和setter。 send
位将传入的参数分配给它们各自的变量。
如果你想完全跳过Clientele
课程,你可以这样做:
def expire
@search = Search.new(search_params)
if @search.valid?
@clients = Client.all.map do |client|
{exp: client.experience, email: client.email}
end
end
end
在这种情况下,您需要将erb
更改为:
<% @clients.each do |client| %>
<%= client[:exp] %>
<%= client[:email] %>
<% end %>
<%= clients %> #=> []
或者,如果你喜欢你的erb,你可以这样做:
def expire
@search = Search.new(search_params)
if @search.valid?
@clients = Client.all.map do |client|
OpenStruct.new(exp: client.experience, email: client.email)
end
end
end
在这种情况下,你仍然可以:
<% @clients.each do |client| %>
<%= client.exp %>
<%= client.email %>
<% end %>
<%= clients %> #=> []