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_controller.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当你作为 a传入时collection,这个局部变量将引用一个名为 的奇异局部变量car,然后可以将它与现在局部变量一起传递给下一个局部date变量。由于正在渲染的部分与此处不同(在下方calendars/),partial因此此处明确需要关键字。

_calendar_stuff.html.haml

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

编辑

建议将调用移至collection_cars_list.html.haml 但这不适合该问题。

编辑 2

如果您仍想将局部变量指定为 ,这是上述代码的版本this_car,因此您将覆盖将自动生成的car局部变量collection

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 回答