我有一个页面可以像这样呈现一个集合:
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
对象传递给嵌套的部分。
有谁知道为什么?
P.S。如果我用
构造代码@cars.each do |car|
render 'cars_list', locals: {this_car: car}
end
我得到了同样的行为。
答案 0 :(得分:-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
的单一化局部变量,然后可以将其传递给下一个部分,使用now-local 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