5

コレクションを大まかに次のようにレンダリングするページがあります。

index.html.haml

= render partial: 'cars_list', as: :this_car,  collection: @cars

_cars_list.html.haml

編集: _cars_list には、個々の車に関するその他の情報があります。

%h3 Look at these Cars!
%ul
  %li Something about this car
  %li car.description
%div
  = render partial: 'calendars/calendar_stuff', locals: {car: this_car}

_calendar_stuff.html.haml

- if car.date == @date
  %div 
    = car.date

_cars_contoller.rb

def index
  @cars = Car.all
  @date = params[:date] ? Date.parse(params[:date]) : Date.today
end

カレンダー関連のパーシャルで何が起こるかというと、それthis_carは常に車のコレクションの最初の車です。つまり、同じ日付が何度も印刷されます。

ロジックをパーシャルに移動すると、_calendar_stuff出力cars_list結果が期待どおりに変更されます。

そのため、Rails はthis_car、パーシャルをレンダリングするたびにローカル オブジェクトをネストされたパーシャルに渡していないようです。

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

PSコードを構造化すると

@cars.each do |car|
  render 'cars_list', locals: {this_car: car}
end

私は同じ振る舞いをします。

4

1 に答える 1

-1

このリファクタリングを試して、目的の出力が得られるかどうかを確認してください。

index.html.haml

= render 'cars_list', collection: @cars, date: @date

partialキーワードを取り除き、@dateインスタンス変数をローカル変数として渡して、パーシャル内のロジックをカプセル化します。この点はRails Best Practicesから得ました。

_cars_list.html.haml

%h3 Look at these Cars!
%ul
  %li Something about this car
%div
  = render 'calendars/calendar_stuff', car: car, date: date

として渡した@carsのでcollection、このパーシャルは と呼ばれる単一化されたローカル変数への参照を持ちcar、現在のローカル変数とともに次のパーシャルに渡すことができdateます。レンダリングされているパーシャルはこことは別の場所 (上の下calendars/) にあるため、ここではpartialキーワードが明示的に必要です。

_calendar_stuff.html.haml

- if car.date == date
  %div 
    = car.date

編集

への呼び出しを _cars_list.html.haml に移動することを提案しましたcollectionそれは問題には適切ではありませんでした。

編集 2

これは、ローカル変数を として指定したい場合の上記のコードのバージョンです。したがって、自動的に生成されるローカル変数をthis_carオーバーライドすることになります。carcollection

index.html.haml

= render 'cars_list', collection: @cars, as: :this_car, date: @date

_cars_list.html.haml

%h3 Look at these Cars!
%ul
  %li Something about this car
  %li this_car.description
%div
  = render 'calendars/calendar_stuff', this_car: this_car, date: date

_calendar_stuff.html.haml

- if this_car.date == date
  %div 
    = this_car.date
于 2012-12-20T09:18:58.250 に答える