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

Posted

技术标签:

【中文标题】将局部变量传递给嵌套的局部变量【英文标题】:Passing a local variable into a nested partial 【发布时间】:2012-12-07 17:47:27 【问题描述】:

我有一个页面大致呈现这样的集合:

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 对象传递给嵌套的局部。

有人知道为什么吗?

附:如果我用

构造代码
@cars.each do |car|
  render 'cars_list', locals: this_car: car
end

我得到了同样的行为。

【问题讨论】:

【参考方案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 的单一局部变量,然后可以将其与现在本地的@ 一起传递到下一个部分987654329@ 变量。由于要渲染的部分与此处不同(在calendars/ 下方),因此此处明确需要partial 关键字。

_calendar_stuff.html.haml

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

编辑

建议将呼叫collection 转移到_cars_list.html.haml,但这不适合问题。

编辑 2

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

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

【讨论】:

试过了,但仍然有相同的行为。有几件事:1)partial:index.html.haml 文件中是必需的,因为我也在使用 collection: 参数。我相信你只能用= render 'cars_list' 之类的东西把它关掉。 2) 单数化的局部变量 car 在 cars_list.html.haml 文件中效果很好,但是当我将其传递给 _calendar_stuff 时,它总是在集合中的第一个 car 中传递,而不是迭代器中的当前汽车。 我之前使用过没有partial 关键字的collection,但是如果你发现如果你忽略它会出现问题,那么一定要继续使用它。 我认为这行不通,因为我想在_cars_list 中为每辆汽车渲染一些代码,然后为同一辆汽车渲染_calendar_stuff。我相信使用集合渲染 calendar_stuff 会为集合中的每个项目一个接一个地渲染该部分 好的,很公平,那么对collection 的调用本来就在正确的位置。因此,我可能会从我的答案中删除该编辑。我想不出为什么只有列表中的第一个对象会被渲染,除非@cars 只包含一辆车。我的一个应用程序中的代码非常相似,并且在成员对象上呈现部分内的部分内容没有问题。 我是个白痴。 rails 代码运行良好,我在前端有一个 js 错误,看起来只有集合的第一项被传入。感谢您的帮助,我将删除问题。跨度>

以上是关于将局部变量传递给嵌套的局部变量的主要内容,如果未能解决你的问题,请参考以下文章

将指向局部变量的指针传递给函数:它安全吗?

问题将模板类型传递给函数并用于局部变量赋值 c++

如何将局部变量传递给熊猫中的用户定义函数?

如何将局部变量传递给 Invoke-Command -ScriptBlock

将局部变量从控制器传递到视图

将局部变量传递给 create.js.erb 以进行迭代中的迭代