控制器中的Rails Disposable Object

时间:2017-07-18 16:21:35

标签: ruby-on-rails arrays controller ruby-hash

尝试将对象存储在数组中以在视图中进行迭代。

在我的控制器中:

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 %> #=> []

我不确定我做错了什么,我似乎无法创建一个临时对象来存储值并将其存储到数组中。任何帮助或建议都会有所帮助。

1 个答案:

答案 0 :(得分:0)

您永远不会初始化@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返回由块结果填充的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 %> #=> []