我有一个与贡献者有一个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的末尾来修补此问题,但无济于事。有没有更好的方法将这些链接从模型转移到视图?
答案 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已经回答了我想说的话