我的视图中有一个方法,根据所获得的对象类决定打印哪个HTML:
<% def laybricks(c,stream) %>
<% if c.is_a?(Post) %>
<article>
// Tons more HTML unique to posts
</article>
<% elsif c.is_a?(Photograph) %>
<article>
// Tons more HTML unique to photographs
</article>
<% end %>
<% end>
但是自从编写Rails以来,我现在对Rails了解得更多。如何将其传输到我的模型,以便我可以在视图中调用该方法并使其打印HTML相同?
答案 0 :(得分:2)
视图中的方法肯定会更好地转移到帮助程序。
但是对于你的需要,最好的解决方案是 partials 利用一些rails magic:
<%= render @c %>
如果_post.html.erb
是@c
的实例,则会神奇地呈现部分Post
,如果是_photograph.html.erb
的实例,则会Photograph
。这些部分应位于同一个视图文件夹中,您可以分别在每个部分中将对象引用为post
和photograph
。
有关详细信息,请参阅Rails Rendering Guide。
ADDON:
如何将其传输到我的模型,以便我可以在视图中调用该方法并让它打印HTML
生成HTML通常不是模型的责任,但如果您最终想要这样做,最好的方法是使用通常称为Presenter或Decorator的设计模式。例如。 draper
宝石存在于此,但也存在许多其他宝石。在Rails社区中有很多讨论应该如何调用这种模式,如何实现它以及它是否值得。
答案 1 :(得分:1)
更新:
应用程序助手
def laybricks(c,stream)
content = []
if c.is_a?(Post)
content << "<article> </article>"
elsif c.is_a?(Photograph)
content << "<article> </article>"
end
end
您的观点
<%= raw laybricks %>
OR
<%= laybricks.html_safe %>
注意:原始助手将允许解释纯HTML。您也可以使用html_safe
方法来解释相同的内容。