【问题标题】:Rails: Creating HTML in a ModelRails:在模型中创建 HTML
【发布时间】:2012-11-19 18:39:09
【问题描述】:

我有一个与贡献者有 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 的末尾来修补此问题,但无济于事。有没有更好的方法将这些链接从模型传输到视图?

【问题讨论】:

  • 如果您在“模型”中创建响应,那么它不是 MVC。它只是带有 ORM 的经典意大利面条代码。
  • 在“模型”层生成 HTML 是不好的做法,因为生成表示是助手和视图的责任
  • 很高兴知道这一点。过去一天我一直在研究 helpers,他们似乎对 rails 的名声好坏参半。像thisthis 这样的文章不会把它们放在最好的角度。不过,也许他们的担忧被夸大了?

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


【解决方案1】:

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

更好的方法是在您的Publication 模型上使用has_many :authors, :model =&gt; 'Contributor' 关系,您可以通过简单地调用来调出您的Contributor 对象数组

@publication.authors

您希望像这样在视图中迭代这些:

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

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

现在,重复三行代码的成本似乎并不高,但有一些方法可以在不违反 MVC 模式和使模型混乱的情况下干掉它:

  • 将打印出版物作者的代码放入部分中,并根据需要调用部分。
  • 将代码放入助手中,包含助手并根据需要调用方法。

这是来自to_sentence 的源代码的 sn-p(我认为您可以根据需要对其进行调整):

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找到。

【讨论】:

  • 感谢您的反馈!我以这种方式处理问题的原因是作者列表出现在许多不同的视图中,我不想重复创建此列表所需的代码。使用单一方法将更有效且更易于维护。我会更多地研究 eval,看看是否有办法让它与我的代码一起工作。
  • 我已将代码放在部分中,但问题仍然存在。如果您回顾原始代码,您会注意到末尾的“authors.to_sentence”行。这就是我将链接放入数组的原因,我怀疑这也是我获取原始代码而不是渲染链接的原因。是否有更好的方法来实现 to_sentence?
  • 我最终创建了一个精心制作的 if-then 树,它复制了 to_sentence 的效果。它有效,但感觉非常hacky。如果您不知道更好的解决方案,我会在几个小时内继续接受这个。这种方法效果很好,而且你的解释透彻而清晰。
【解决方案2】:

您似乎正在尝试在您的行中使用haml 语法。也许不使用link_to,而是使用html超链接标签本身?

话虽如此,您为什么要让模型返回 html?

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-05-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多