首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >控制器中的Rails Disposable对象

控制器中的Rails Disposable对象
EN

Stack Overflow用户
提问于 2017-07-19 00:21:35
回答 1查看 60关注 0票数 0

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

在我的控制器中:

代码语言:javascript
复制
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数组会产生一个空数组:

代码语言:javascript
复制
<% @clients.each do |client| %>
  <%= client.exp %>
  <%= client.email %>
<% end %>
<%= clients %> #=> []

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

EN

回答 1

Stack Overflow用户

发布于 2017-07-19 00:30:51

您永远不会初始化@allClients (至少在您提供的代码中)。因此,@allClientsnil,而@allClients.each不产生任何内容。

试试更多像这样的东西:

代码语言:javascript
复制
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类:

代码语言:javascript
复制
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类,您可以这样做:

代码语言:javascript
复制
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更改为:

代码语言:javascript
复制
<% @clients.each do |client| %>
  <%= client[:exp] %>
  <%= client[:email] %>
<% end %>
<%= clients %> #=> []

或者,如果你喜欢erb的方式,你可以这样做:

代码语言:javascript
复制
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  

在这种情况下,您仍然可以执行以下操作:

代码语言:javascript
复制
<% @clients.each do |client| %>
  <%= client.exp %>
  <%= client.email %>
<% end %>
<%= clients %> #=> []  
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45172309

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档