Rails:在模型中创建HTML

时间:2012-11-19 18:39:09

标签: html ruby-on-rails ruby-on-rails-3

我有一个与贡献者有一个has_many关系的出版物模型。在模型中,我有一个方法可以按行创建一个html-ready:

def authors
  authors = []
  Contributor.where(:publication_id => self.id).each do |author|
    authors << "link_to "+author.name+", Contributor.find("+author.id.to_s+")"
  end
  authors.to_sentence
end

在我看来,我有以下几行:

by <%= @publication.authors %>

但它不是渲染链接,而是渲染原始代码,例如:

by link_to B, Contributor.find(1)

我已经尝试通过将@html_safe添加到@ publication.authors的末尾来修补此问题,但无济于事。有没有更好的方法将这些链接从模型转移到视图?

2 个答案:

答案 0 :(得分:3)

您正在将字符串推送到authors数组中。它看起来像是有效的代码,因此在上运行eval应该工作。 (实际上author.name可能会将其评估为未定义的符号,因此请将其标记为。)

更好的方法是在has_many :authors, :model => 'Contributor'模型上使用Publication关系,只需调用

即可显示Contributor个对象的数组
@publication.authors

你想在你的视图中迭代这些:

<% @publication.authors.each do |author| %>
  <%= link_to author.name, author %>
<% end %>

另请注意,如果您在视图中以这种方式显示多个Publication个对象,则在检索它们时,您需要在控制器中使用Publication.includes(:authors)以避免使用“N +” 1“问题。

现在,重复三行代码看起来并不是很昂贵,但是有一些方法可以在不违反MVC模式的情况下进行DRY,并使模型混乱:

  • 放置代码以将出版物的作者打印成部分,并根据需要调用部分。
  • 将代码放入帮助程序中,包含帮助程序并根据需要调用该方法。

以下是来自to_sentence来源的摘录(我认为您可以根据自己的需要进行调整):

case length
  when 0
    ""
  when 1
    self[0].to_s.dup
  when 2
    "#{self[0]}#{options[:two_words_connector]}#{self[1]}"
  else
    "#{self[0...-1].join(options[:words_connector])}#{options[:last_word_connector]}#{self[-1]}"
end

可以找到完整的来源here

答案 1 :(得分:2)

看起来你正试图在你的行中使用haml语法。也许不使用link_to,而是使用html超链接标签?

话虽如此,为什么你有一个模型返回HTML?

编辑:bdares已经回答了我想说的话