6

と を使用して動的コンテンツを作成しようとしていyieldますcontent_for。基本的に私はたくさんのレイアウトを持っています。そして、レイアウトごとにたくさんのビューを作成したくありません。必要なときにビュー パーツをレンダリングしたい。コードのさまざまな部分については問題ありません。しかし、内容が異なる同じ部分に問題があります。

私の中でapplication.html.erb

<%= yield %>
<%= yield :name_section %>

そして、私show.html.erbは持っています。

<% content_for :name_section do %>
    <b>Name:</b>
    <%= @post.name %>
<% end %>

これが質問です。

異なる内容の name_section を複数にしたい場合はどうすればよいですか。つまり; :name_sectionさまざまな場所をさまざまなコンテンツで自分のビューに入れたいです。

例えば;

<table>
  <tr>
    <td>
      <%= yield :name_section %>
    </td>
  </tr>
  <tr>
    <td>
      <%= yield :name_section %>
    </td>
  </tr>
</table>

何か案は?

ありがとうございました。チャダシュ

4

3 に答える 3

8

あなたが求めていたことが可能になったと思います:

# The template
<%= render layout: "my_layout" do |customer| %>
  Hello <%= customer.name %>
<% end %>

# The layout
<html>
  <%= yield Struct.new(:name).new("David") %>
</html>

から: http://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

うまくいけば、これは同じ解決策を探している他の誰かに役立ちます.

于 2014-06-03T00:15:57.080 に答える
2

ドキュメントを考えると:

http://api.rubyonrails.org/classes/ActionView/Helpers/RenderingHelper.html#method-i-_layout_for

およびメソッドのソースコード(そこで参照できます):

def _layout_for(*args, &block)
  name = args.first

  if block && !name.is_a?(Symbol)
    capture(*args, &block)
  else
    super
  end
end

あなたが求めていることはyield、レイアウトでは不可能です。

于 2012-05-25T11:26:23.060 に答える
2

次の解決策は私にとってうまくいきました。引数を渡すことはできませんが、呼び出しの直前content_for(2 回目) に引数をインスタンス変数に割り当てると、インスタンス変数を で参照できるようになりますcontent_for。基本的な考え方はcontent_for、最初に呼び出されたときにコンテンツを生成し、そのコンテンツは静的なままにするというものですが、この回避策では、コンテンツを表示する準備ができるまで静的コンテンツの生成を遅らせます。

まず、この関数をヘルパー モジュールに追加します。

def immediate_content_for name, content = nil, &block
  @immediate_content ||= {}
  if content || block_given? then
    @immediate_content[name] = Proc.new { content_for name, content, &block }
    nil
  else
    @immediate_content[name].call
    content_for name
  end
end

次に、 に渡したいとarg1しますcontent_for。これを行うことができます:

<% content_for :my_form %>
  <%= some_helper_function(@arg1) %>
<% end %>

次に、コードの後半で、定義した後arg1:

<%= @arg1 = arg1 %>
<%= content_for :my_form %>

immediate_content_forの動作が の動作とまったく同じであることを保証できないという意味でのハックであり、レールの将来のバージョンでcontent_forの動作が変更された場合は、必要に応じて更新する必要があります。ミラーリングを続行します。これは最適なソリューションではありませんが、今のところ問題はありません。content_forimmediate_content_forcontent_for

于 2012-09-10T16:14:14.220 に答える