尝试将对象存储在数组中以在视图中循环访问。
在我的控制器中:
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 %> #=> []
我不确定我做错了什么,我似乎不能只创建一个临时对象来存储值并将其存储到数组中。任何帮助或建议都会有所帮助。
你从不初始化@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
返回由块(初始化的Clientele
对象(的结果填充的Array
。
您要添加更多代码吗?我猜你是。因为,正如目前所写,整个Clientele
实例化的事情似乎毫无意义。
你可以像这样制作你的客户类:
class Clientele
def initialize(params={})
params.each do |k,v|
class_eval{attr_accessor k}
send("#{k}=",v)
end
end
end
然后你就可以按照我展示的方式实例化它。class_eval
位创建吸气剂和二传手。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 %> #=> []