1

私のビューの 1 つで、コード ブロックにレイアウトを適用します。

# In app/views/sessions/new.html.erb
<% render :layout => 'home/shadow_box' do %>
  #... code for sign in form here
<% end %>

レイアウトは、4 つの側面すべてに png シャドウがある div です。

サイト全体でこのレイアウトを使用しているため、シャドウ div の幅を指定する変数をレイアウトに渡したいと考えています。コードブロックでコンテンツを使用してみました:

# In app/views/sessions/new.html.erb
<% render :layout => 'home/shadow_box' do %>
  <% content_for :box_width %>640<% end %>
  #... code for sign in form here
<% end %>

# In app/views/home/_shadow_box.html.erb
<div class="shadow-one" style="width:<%= yield :box_width %>;">
  <div class="corner-a"></div>
  <div class="corner-b"></div>
  <div class="shadow-two">
    <div class="shadow-three">
      <div class="shadow-four">
        <%= yield %>
      </div>
    </div>
  </div>
</div>

これは機能せず、代わりにコード ブロック全体の二重レンダリングが発生しました。

この問題に取り組む最善の方法は何ですか?

4

2 に答える 2

1

理解した。

APIから:「1つのレイアウトで複数回生成し、ブロック引数を使用してセクションを区別することもできます。」

解決:

# In app/views/sessions/new.html.erb
<% render :layout => 'home/shadow_box' do | section | %>
  <%- case section when :box_width -%>
    #width goes here. I.e., 640px
  <%- when :content -%>
    #code block goes here
  <% end -%>
<% end %>

#In app/views/home/_shadow_box.html.erb
<div class="shadow-one" style="width:<%= yield :box_width %>;">
  <div class="corner-a"></div>
  <div class="corner-b"></div>
  <div class="shadow-two">
    <div class="shadow-three">
      <div class="shadow-four">
        <%= yield :content %>
      </div>
    </div>
  </div>
</div>
于 2010-08-21T00:35:21.700 に答える
0

まず、 と の違いを知る必要がありlayoutsますpartials。パーシャルは通常ビューから取得されますが、ajax を使用している場合はコントローラーから使用することもできます。ほとんどの場合、レイアウトはコントローラーで使用されます。

最初に application/ などの共有フォルダーにファイルを作成し、このフォルダーに任意の名前のファイルを配置しますが、サイト全体に含めたい素材が含まれます。次に、変数をパーシャルに渡すと、パーシャルでローカル変数として呼び出されます。また、パーシャルを使用するとrender :partial =>、単に置くと言う必要はありませんrender 'application/some_file'

したがって、これが必要なビューから:

<%= render 'application/your_file', :div_size => '600' %>

そして、次のようなフォルダーのパーシャルから次のようにしますapplication/your_file.html.erb

<div style="width:<%= div_width %>px;">
   content
</div>
于 2010-08-20T23:54:00.377 に答える