尝试将对象存储在数组中,以便在视图中迭代。
在我的控制器中:
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 %> #=> []我不确定我做错了什么,我似乎不能只是创建一个临时对象来存储值,并将其存储到一个数组中。任何帮助或建议都会很有帮助。
发布于 2017-07-19 00:30:51
您永远不会初始化@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实例化的事情看起来有点毫无意义。
您可以像这样创建您的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 %> #=> [] https://stackoverflow.com/questions/45172309
复制相似问题