26

重複の可能性:
Rails:ローカルをパーシャルに渡すための構文について混乱しています

ローカル変数(モデルに関連するフィールドがない)をpartialに渡したい。

# infos/index.html.erb

<%= render :partial => 'info', :locals => {:info => first, :img_style => "original"} %> 

:img_styleは画像のhtmlスタイルになります。

# infos/_info.html.erb
<% first = @infos.shift %>
<%= image_tag(info.image.url, :class => img_style),  info %> 
# and here goes code for normal iteration
<% @infos.each do |e| %>
# etc

ただし、機能せず、エラーが返されます。

# GET /infos/
undefined local variable or method `img_style' for #<#<Class:0xc471f34>:0xc470cc4>

冗長なパーシャルを作成せずに実行できますか?

英語でごめんなさい。:P

編集:

モデル情報には:img_styleフィールドがありません

# db/schema.rb
  create_table "infos", :force => true do |t|
    t.string   "title"
    t.text     "description"
    t.integer  "place_id"
    t.datetime "created_at"
    t.datetime "updated_at"
    t.string   "image_file_name"
    t.string   "image_content_type"
    t.integer  "image_file_size"
    t.datetime "image_updated_at"
    t.text     "short"
  end

EDIT2:

シンプルでも

<%= img_style %>

動作しません。

アプリケーションスタックトレース

app/views/infos/_info.html.erb:3:in `_app_views_infos__info_html_erb___1029249744_92158380_1472718'
app/views/infos/index.html.erb:7:in `_app_views_infos_index_html_erb__184644561_92172050_0'
app/controllers/infos_controller.rb:8:in `index'

EDIT3:

ビュー

# infos/index.html.erb
<div >
  <h1><%= t('info.infos') %></h1>
  <div id="left">
    <% first = @infos.shift %>
    <div>
      <% @aimg_style = "original"%>
      <%= render 'info', :locals => {@img_style => @aimg_style } %>
    </div>
    <ul>
      <% @infos.each do |e| %>
        <li>
          <div>
            <%= render :partial => 'info', :object => e %>
          </div>
        </li>
      <% end %>
    </ul>
    <%= will_paginate @infos %>

# infos/_info.html.erb
<%#= link_to thumbnail(info, "listTabsImg", false, img_style), info %>
  <%#= image_tag(info.image.url()) %>
  <%= img_style %>
<p>
  <strong class="nameBox"><%= link_to info.title, info %></strong>
  <span><%= info.short %>...</span>
  <%= link_to "#{t('more')} »", info %>
</p>

ついに

これは機能しません:

# infos/index.html.erb
<% first = @infos.shift %>
<div class="boxEvent">
  <% @aimg_style = "original"%>
  <%= first %>
  <%= render 'info', :locals => {:info => first, :img_style => @aimg_style } %>
</div>

これは機能します:

# infos/index.html.erb
  <% @infos.each do |e| %>
    <li>
      <div class="boxEvent">
        <%= render :partial => 'info', :locals => {:info => e, :img_style => "original"} %>
      </div>
    </li>
  <% end %>

誰もが理由を知っていますか?

4

5 に答える 5

50

私は実際、Rails 3 でこの構文を使用しています。

render "a_partial", :a_local_variable => whatever, :another_variable => another
于 2011-06-08T14:29:20.597 に答える
12

これは機能するはずです:

<%= render :partial => "info", :locals => { :img_style => "original" } %>

この部分で:

# infos/_info.html.erb
<%= image_tag(info.image.url, :class => img_style),  info %>

ただし、部分的に間違っていると呼んでいる場合は、これを部分的に試してください。

# infos/_info.html.erb
<%= image_tag(info.image.url(img_style)),  info %>
于 2011-06-08T15:08:08.500 に答える
5

私はこれに数時間を費やしました。ビューでは、 render :partial => ? , :locals => (....} 最初に呼び出した場合のようです:

render :partial => ? without a locals hash

:partial => ?そして、ローカル ハッシュを使用してrender を呼び出します。ローカル ハッシュはビューに渡されません。

最初の呼び出しに、同じ変数が設定されたローカル ハッシュが含まれている場合、'' REAL 値を使用した 2 番目の呼び出しが機能します。

于 2012-03-01T03:12:19.963 に答える
2

コード (最初の行に示したもの) が機能するはずです。エラーはありません。私も自分でテストしましたが、うまくいきます。

このようなエラーの通常の理由は次のとおりです。

  • 変数名のスペルミス
  • :local を渡さない他の場所からもパーシャルを呼び出します。

モデルに属性「img_style」がないことは重要ではありません。

infos/index.html.erbあなたが呼び出す場所が 2 つあり、render :partial => 'info', :object => ...ここには :locals がないことがわかります。行番号だけが以前に投稿したスタックトレースと一致しないため、どの呼び出しが問題を引き起こしているかを特定するのは困難です。

renderメソッドへの両方の呼び出しに修正が必要だと思います。

render :partial => "info"最初のものでは、具体的に、の代わりに呼び出しますrender "info"。これは Rails のバグかもしれませんが、奇妙な理由で、この場合 :locals がビューに渡されないようです。

2 番目の呼び出しでrenderは、:locals を追加するだけです。

于 2011-06-08T15:12:40.483 に答える
1

問題はトレーリング, infoコールだと思います。infoのオブジェクトを探していますimg_style。あなたはそれを必要としません。

私はパーシャルを使用するのが大好きですが、最近、ヘルパーメソッド、特にこのような単純なレンダリングの美しさも見ています。

def info_image(info, class_name="original")
   image_tag(info.image.url, :class => class_name)
end

その後、ちょうど

<%= info_image(first) %>

また

<%= info_image(first, "anotherclass") %>

ビューで。はるかにきれい。

これまで以上に複雑になります。コードを変更する必要があるのは1か所だけです。

于 2011-06-08T15:26:46.497 に答える