Rails:为什么我可以通过控制器将单个记录属性发送到新记录而不是数组?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Rails:为什么我可以通过控制器将单个记录属性发送到新记录而不是数组?相关的知识,希望对你有一定的参考价值。

通过Rails中的控制器创建文章。一种简单的方法,或多或少有效;只需从其他地方调用该方法,它就会通过后端生成一篇新文章并填写值:

def test_create_briefing
  a = Article.new
  a.type_id = 27
  a.status = 'published'
  a.headline = 'This is a headline'
  a.lede = 'Our article is about some interesting topic.'
  a.body = test_article_text
  a.save!
end

如果test_article_text只是一个记录,这可以正常工作并将现有的文章正文打印到新的文章正文中。在视图中看起来正确并且在“编辑”中看起来正确。一切都很完美

def test_article_text
  a = Article.find_by_id(181)
  a.body
end

但是,如果我尝试用最后十篇文章做同样的事情,它不起作用:

def test_article_text
  Article.lastten.each do |a|
    a.body
  end
end

在视图中你得到:

[#, #, #, #, #, #, #, #, #, #]

在“编辑”中你得到:

[#<Article id: 357, headline: "This is a headline", lede: "Our article is about some interesting topic.", body: "[#<Article id: 356, headline: \"This is a headline\"...", created_at: "2017-12-31 20:40:16", updated_at: "2017-12-31 20:40:16", type_id: 27, urgency: nil, main: nil, status: "published", caption: nil, source: nil, video: nil, summary: nil, summary_slug: nil, topstory: false, email_to: nil, notification_slug: nil, notification_message: nil, short_lede: nil, short_headline: nil, is_free: nil, briefing_point: nil>, #<Article id: 356, headline: "This is a headline"…etc, etc, etc.

我不知道什么?我错过了什么?

答案

它返回如下,因为Article.lastten是控制器返回的变量。

[#<Article id: 357, headline: "This is a headline", lede: "Our article is about some interesting topic.", body: "[#<Article id: 356, headline: \"This is a headline\"...", created_at: "2017-12-31 20:40:16", updated_at: "2017-12-31 20:40:16", type_id: 27, urgency: nil, main: nil, status: "published", caption: nil, source: nil, video: nil, summary: nil, summary_slug: nil, topstory: false, email_to: nil, notification_slug: nil, notification_message: nil, short_lede: nil, short_headline: nil, is_free: nil, briefing_point: nil>, #<Article id: 356, headline: "This is a headline"…etc, etc, etc.

要返回所有文章正文,请执行以下操作:

def test_article_text
  arr = Array.new
  Article.lastten.each do |a|
    arr << a.body
  end
  arr # should be added so it will be the last value returned from your controller
end
另一答案

所以@Shiko几乎是正确的,肯定是在正确的道路上。不得不操纵数组并做两件事让它工作:

  1. .join阵列的一些部分,以消除所有的垃圾;
  2. 以与通常在视图中不同的方式连接每篇文章的不同位。所以to_sfor每个属性,连接"" + ""和重建网址与数组中可用的信息(没有link_to等)。
  3. "**"is降价,因为我正在使用它,但我想你可以在那里打开html标签,如果你需要的话。

这有效:

def test_article_text
  arr = Array.new
  Article.lastten.each do |a|
  arr << "**" + a.headline.to_s + "**: " + a.text.to_s + "[Read now](/articles/#{a.id}-#{a.created_at.strftime("%y%m%d%H%M%S")}-#{a.headline.parameterize})"
  end
  arr.join("\n\n")
end

以上是关于Rails:为什么我可以通过控制器将单个记录属性发送到新记录而不是数组?的主要内容,如果未能解决你的问题,请参考以下文章

使用 ajax 和 rails 将多个参数保存在单个数组中

Rails 3中单个记录的多个外键?

Rails - 如何查找单个记录(用户名)在主页中向任何访问者显示它

Rails 3 从单个模型和方法创建多个记录条目

Rails - 更新单个属性:与自定义操作或带有隐藏字段的表单链接?

Rails 将 3.2.* 升级到 4 不在 Rails 控制台中显示所有用户属性