web-dev-qa-db-ja.com

Rails 3、ローカル変数をパーシャルに渡す

可能性のある複製:
レール:パーシャルにローカルを渡すための構文について混乱

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

# 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>

[〜#〜] finally [〜#〜]

これは機能しません:

# 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 %>

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

26

私は実際にRails 3:

render "a_partial", :a_local_variable => whatever, :another_variable => another
50
d11wtq

これは動作するはずです:

<%= 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 %>
12
Devin M

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

render :partial => ? without a locals hash

そしてTHEN呼び出しは、ローカルハッシュを使用して:partial => ?をレンダリングし、ローカルハッシュIS NOTはビューに渡されません。

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

5
John

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

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

  • 変数名のつづりが間違っています
  • :localを渡さない他の場所からもパーシャルを呼び出します。

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

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

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

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

renderへの2番目の呼び出しで、:localsを追加します。

2
Arsen7

問題は、末尾の, info呼び出しだと思います。 img_styleinfoオブジェクトを探しています。必要ありません。

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

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

それからちょうど

<%= info_image(first) %>

または

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

ビューで。ずっときれい。

これまで以上に複雑になります。コードを1か所で変更するだけで済みます。

1
natedavisolds