将局部变量传递给嵌套的局部变量

时间:2012-12-20 08:47:15

标签: ruby-on-rails nested partial-views

我有一个页面可以像这样呈现一个集合:

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

我得到了同样的行为。

1 个答案:

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