在模型中编写Ruby方法,在视图中输出HTML

时间:2013-03-07 11:46:44

标签: html ruby-on-rails ruby

我的视图中有一个方法,根据所获得的对象类决定打印哪个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相同?

2 个答案:

答案 0 :(得分:2)

视图中的方法肯​​定会更好地转移到帮助程序。

但是对于你的需要,最好的解决方案是 partials 利用一些rails magic:

<%= render @c %>
如果_post.html.erb@c的实例,则

会神奇地呈现部分Post,如果是_photograph.html.erb的实例,则会Photograph。这些部分应位于同一个视图文件夹中,您可以分别在每个部分中将对象引用为postphotograph

有关详细信息,请参阅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方法来解释相同的内容。