导轨控制器中的一次性对象



尝试将对象存储在数组中以在视图中循环访问。

在我的控制器中:

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(至少在你提供的代码中(。所以,@allClientsnil的,@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 %> #=> []  

最新更新