在Haml中渲染局部视图并将变量传递给它

4
我正在尝试通过遍历变量来渲染我的局部文件,然后将特定的变量传递给局部文件,但它无法看到这个变量。

这里是我正在渲染的地方

(dogs.html.haml)

- dogs.each do |dog|
    .dog
      = render 'dog', :locals => { :dog => dog }

然后我希望变量“dog”能在我的局部文件中显示。
(_dog.html.haml)
.title
  = dog.name

但是它没有显示出来

我做错了什么?

1个回答

7
你正在混合使用两种不同的渲染局部视图的方式。
请使用以下(传统)形式之一...
render partial: 'dog', locals: {dog: dog}

或者这种更新的形式:

render 'dog', dog: dog

或者使用这个更好的新形式,你应该优先考虑:

= render dog

但不是你写的那个版本。你从第二种方式中取了render 'dog'部分,又从第一种方式中取了locals: { dog: dog }部分。这会传递一个名为locals的单个本地变量,其值为哈希。

第三种方法是首选方法。如果你有一个ActiveModel对象,只需调用render <object>,它就会根据模型名称自动选择正确的局部视图。

这也适用于ActiveRecord模型集合。你应该完全删除@dogs.each循环,并简单地调用

= render @dogs

这将自动为集合中的每只狗调用= render dog。您只需将您的.dog移动到_dog局部文件中即可。

你还可以使用= render partial: "dog", collection: @dogs来渲染集合,这将自动为你创建一个 dog 局部变量 详见(相关文档) - etdev
1
@etdev 再次提醒,那是一种过时的方法,你应该避免使用。更好的方法是简单地使用= render @dogs,这是新的、功能相同的方式。 - user229044
@user229044 不正确。在Rails 7+中,使用显式的partial进行渲染是Hotwire的首选方法。 - undefined
@Charlie 你会注意到这个问题被标记为Rails 3/4,所以它过去和现在都是正确的。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接