Rails疑问:为何可向新记录传递单个属性,却无法传递数组?
问题分析与解决办法
嘿,这个问题的核心其实是Ruby中each方法的返回值特性在“捣蛋”!让我给你拆解清楚:
为什么第一种写法正常?
第一个test_article_text方法里,你找到单个Article对象后直接返回它的a.body——这是一个字符串类型的值,赋值给新文章的body属性完全符合预期,所以视图和编辑页面都能正常显示。
第二种写法的问题出在哪?
当你改成用each遍历最后10篇文章时:
def test_article_text Article.lastten.each do |a| a.body end end
Ruby的each方法有个关键特性:它的返回值是调用它的原集合(也就是这10个Article对象组成的数组),而不是你在循环里写的a.body。所以你最终赋值给新文章body的是一个Article对象数组,视图和编辑页面自然就把数组转换成了对象的字符串表示形式[#, #, #, ...]。
怎么修复?
如果你想把这10篇文章的body内容合并成一个字符串赋值给新文章,需要用map方法先收集所有body内容,再用join拼接成一个完整的字符串:
def test_article_text # 用map收集每篇文章的body,再用换行(或自定义分隔符)拼接 Article.lastten.map(&:body).join("\n\n") end
map(&:body)会遍历每一篇文章,把每个Article对象转换成它的body字符串,最终返回一个字符串数组;join("\n\n")会把数组里的所有字符串用两个换行符分隔,拼接成一个大字符串,这样赋值给新文章的body后,视图和编辑页面就能正常显示文本内容了。
如果你的需求不是拼接,而是要以其他形式展示这些内容,也可以基于map返回的字符串数组做进一步处理,但核心都是要替换掉返回原集合的each,改用能返回你需要的内容的方法。
内容的提问来源于stack exchange,提问作者Matthew Bennett
相关产品推荐
相关产品推荐

