0

在我看来,我有一个方法可以根据它获得的对象的类来决定打印出哪个 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 以来,我现在对它有了更多的了解。如何将它传输到我的模型,以便我可以在视图中调用该方法并让它打印相同的 HTML?

4

2 回答 2

2

视图中的方法肯​​定会更好地移到助手中。

但是对于您的需要,最好的解决方案是使用一些rails魔法的部分:

<%= render @c %>

_post.html.erb如果@c是一个实例并且Post如果_photograph.html.erb它是Photograph. 这些部分应该在同一个视图文件夹中,您可以分别在每个部分中引用您的post对象photograph

有关详细信息,请参阅Rails 渲染指南


添加在:

如何将其传输到我的模型,以便我可以在视图中调用该方法并让它打印 HTML

生成 HTML 通常不是模型的责任,但如果您最终想要这样做,最好的方法是使用通常称为 Presenter 或 Decorator 的设计模式。例如drapergem 为此而存在,但也有许多其他的。Rails 社区中有很多讨论应该如何调用这种模式,应该如何实现它以及是否值得。

于 2013-03-07T11:57:21.350 回答
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 %>

或者

 <%= laybricks.html_safe %>

注意:原始助手将允许解释纯 html。您也可以使用html_safe方法来解释相同的内容。

于 2013-03-07T11:58:06.203 回答