Passar uma variável para uma parcial, trilhos 3?

140

Eu tenho um loop como este:

<% @posts.each do |post| %>
  <% render middle %>
<% end %>

Então, no meu meio parcial, como faço para acessar a postagem atual?

Elliot
fonte
Olá Elliot, estou usando isso no andaime padrão. Usando dentro de index.html.erb para renderizar _show.html.erb em que show parcial contém modal. tudo está funcionando bem, exceto que quando eu pressiono o link show, ele mostra o mesmo ID em vez de mostrar IDs diferentes.
aluno

Respostas:

237

Tente o seguinte:

<% @posts.each do |post| %>
  <%= render 'middle', :post => post %>
<% end %>

Assim, você terá uma variável local postdisponível na parcial.

polarblau
fonte
18
Você precisa <% =%> não <%%> marcas ou então não irá processar
Ryan
4
Lembre-se de que você precisaria <%= render 'middle', :post => post %>dos trilhos 3.1.x
Archonic
124

Dê para o parcial como uma variável local

<%= render :partial => 'middle', :locals => { :post => post } %>

Obviamente, o Rails também possui um atalho para renderizar coleções:

<%= render :partial => 'post', :collection => @posts %>

Nesse caso, ele chamará a postagem parcial para cada postagem com a variável local 'post'

Você pode até renderizar um modelo espaçador entre cada postagem:

<%= render :partial => 'post', :collection => @posts, :spacer_template => 'post_divider' %>
Stefaan Colman
fonte
14
Não sabia sobre a opção: spacer_template, muito legal. Obrigado!
Claudio Acciaresi
11
Observe que o hash: locals não é necessário ao usar o Rails 3. O hash de argumentos é convertido em argumentos passados ​​para o parcial.
superluminary
4
Eu ainda precisava: hash local para que funcionasse .. Estou executando o 3.2.12
mck 21/03
1
<%= render :partial => 'post', :collection => @posts, as: :post %>irá percorrer automaticamente cada um postna sua parcial, para que você possa usá-la postcomo variável.
ahnbizcad
14
<% @posts.each do |post| %>
  <% render middle, :post => post %>
<% end %>

Agora você pode acessar a postagem como a variável local postna parcial

Felix Andersen
fonte
10

Substitua <%= render middle %>por <%= render middle, :post => post %>. Então, no seu middleparcial, você pode acessar a postvariável.

sevenseacat
fonte