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 を書いて以来、Rails についてより多くのことを知るようになりました。ビューでメソッドを呼び出して同じように HTML を出力できるように、これをモデルに転送するにはどうすればよいですか?

4

2 に答える 2

2

ビュー内のメソッドは、間違いなくヘルパーに移動したほうがよいでしょう。

しかし、あなたの必要性のための最良の解決策は、いくつかのレールの魔法を利用する部分的なものです:

<%= render @c %>

がのインスタンスである場合、およびのインスタンスである場合、_post.html.erb魔法のように部分的にレンダリングされます。これらのパーシャルは同じビューフォルダーにある必要があり、オブジェクトをそれぞれとしておよび各パーシャルで参照できます。@cPost_photograph.html.erbPhotographpostphotograph

詳細については、Railsレンダリングガイドを参照してください。


アドオン:

これをモデルに転送して、ビューでメソッドを呼び出し、HTMLを出力できるようにするにはどうすればよいですか?

通常、HTMLを生成するのはモデルの責任ではありませんが、最終的にこれを実行したい場合は、通常プレゼンターまたはデコレーターと呼ばれるデザインパターンを使用するのが最善の方法です。たとえばdraper、これには宝石がありますが、他にもたくさんあります。そして、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 %>

注: rawヘルパーを使用すると、プレーンHTMLを解釈できます。html_safeメソッドを使用して同じものを解釈することもできます。

于 2013-03-07T11:58:06.203 に答える