新手问题 Ruby 给一组对象赋新值,不得其领啊?求助~~

dume2007 · 2013年10月24日 · 最后由 lajunta 回复于 2013年10月24日 · 2096 次阅读
def self.get_cate_news(categories = [])
    categories.each do |item|
      img = self.get_news_list(false, false, "n.classid = '#{item.id}'", 'n.id desc', '2', '0')
      hot = self.get_news_list(false, false, "n.classid = '#{item.id}' and imgurl<>''", 'n.id desc', '12', '0')
      item.img = img
      item.hot = hot
    end
  end

categories 对象是这样的:[{"id":1,"classname":"穿越小说"},{"id":2,"classname":"言情小说"},{"id":3,"classname":"玄幻小说"},{"id":4,"classname":"历史架空"},{"id":5,"classname":"武侠仙侠"},{"id":6,"classname":"都市异能"},{"id":7,"classname":"恐怖悬疑"},{"id":8,"classname":"星际科幻"},{"id":9,"classname":"网游竞技"},{"id":10,"classname":"耽美同人"},{"id":11,"classname":"军事战争"}]

我循环 categories 获得对应的 img、hot 数据,然后赋值给 categories 每个对象, item.img = img item.hot = hot 这种方式我就想给每个对象新增两个 key,这种写法不对~

undefined method `img=' for GgClasslist id: 1, classname: "穿越小说" item 不就是一个 hash 对象吗?它本身有 id,classname 两个 key,我们怎么不能新增 key?

加一行

puts item.class

看看

def self.get_cate_news(categories = [])
    ret = []
    categories.each do |item|
      img = self.get_news_list(false, false, "n.classid = '#{item.id}'", 'n.id desc', '2', '0')
      hot = self.get_news_list(false, false, "n.classid = '#{item.id}' and imgurl<>''", 'n.id desc', '12', '0')
      ret.append({:id => item.id, :classname => item.classname, :img => img, :hot => hot})
    end
    ret
  end

只能这样了~

#2 楼 @Rei 那个请问下要在 Controller 或 model 里直接 puts 没有效果,要想中断该如何操作?

很明显你的 categories 数组的元素是 GgClasslist 的实例,不是单纯的 Hash。请把 GgClasslist 的定义贴出来。 另外,如果是 Hash 的话,也要用

item['img'] = img

不能直接用 item.img 的

在 Rails 里面 puts 改成 Rails.logger.info

我猜你用的是 ActiveRecord,item 不是 hash 而是 ActiveRecord 实例。

我给你我的版本好了

def self.get_cate_news(categories = [])
  categories.map do |category|
    img = self.get_news_list(false, false, "n.classid = '#{item.id}'", 'n.id desc', '2', '0')
    hot = self.get_news_list(false, false, "n.classid = '#{item.id}' and imgurl<>''", 'n.id desc', '12', '0')
    category.attributes.slice(:id, :classname).merge(
      :img => img,
      :hot => hot
    )
  end
end

#5 楼 @downmaopian 以前也经常在这上面出错, 是类实例还是 hash 要搞清楚

需要 登录 后方可回复, 如果你还没有账号请 注册新账号