2015-10-14 114 views
1

我试图通过迭代变量来渲染我的partials,然后将特定变量传递给partial,但它没有看到这个变量。在haml中渲染partials并将变量传递给它

在这里,我使其

(dogs.html.haml)

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

然后,我要变的狗在我的部分

(_dog.html.haml可见)

.title 
    = dog.name 

但它是不可见的

我在做什么错?

回答

1

您正在混合两种不同的渲染部分的方法。

可使用此(传统)的形式...

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部分。

+0

它的工作原理!非常感谢:) – piechos

+0

你也可以用'= render partial:“dog”,collection:@ dogs'来渲染集合,它会自动为你创建一个'dog'局部变量[(相关文档)](http:// api.rubyonrails.org/classes/ActionView/PartialRenderer.html#class-ActionView::PartialRenderer-label-Rendering+a+collection+of+partials) – etdev

+1

@etdev再次,这是一个过时的方式,你应该避免。更好的方法是简单地使用'= render @ dogs',这是新的功能相同的方式。 – meagar