Передача параметров в частичное представление

У меня есть представление, которое отображает несколько изображений и теги связанных с ними изображений. Я решил использовать частичный вид для каждого изображения и его тегов, но у меня возникли проблемы с передачей объекта изображения в частичный вид. Вот основной код, соответствующий соответствующему виду:

<table>
  <% @images.each do |i| %>
    <tr>
      <%= render :partial => :image_tag, :image => i %>
    </tr>
  <% end %>
</table>

Вот код с частичным представлением (частичный вид называется _image_tag.html.erb):

<table>
  <%= image.id %>
  <%= image_tag image.src %>
</table>

Я прочитал в этом потоке, который я могу передать в объекте изображения так, как я это делаю сейчас. Я попытался передать id с помощью хэша опций метода рендеринга, и это тоже не сработало. Ошибка, которую я получаю:

undefined method `model_name' for Symbol:Class

центрируется вокруг строки, где я вызываю render: частичный в основном представлении.

Ответ 1

<%= render partial: "image_tag", locals: {image: i} %>

заключается в том, как передать переменные частичным.

Ответ 2

Что-то еще нужно учитывать для тех, у кого может возникнуть проблема с отправкой значений (-ов) в частичное. Если вы пропустили "partial:" до вашего частичного пути, например...:

<%= render 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %>

... похоже, что вы не сможете напрямую получить доступ к значениям хеш-мест. Скорее, вам нужно будет сделать следующее:

<div>
  <h1> <%= locals[:greeting] %> , my x value is <%= locals[:x] %> </h1>
</div>

Однако , включая "partial:" , перед вашим неполным путем, например:

<%= render partial: 'my_partial', :locals => {:greeting => 'Hello world', :x => 36} %>

... позволяет вам напрямую получать доступ к значениям хэша, например:

<div>
  <h1> <%= greeting %> , my x value is <%= x %> </h1>
</div>

Просто что-то, что я могу рассмотреть, я столкнулся с этой проблемой при попытке получить доступ к значениям хэша locals и понял, что я пропустил компонент "partial:" .

Ответ 3

Вы также можете передать весь объект частичному, как это:

<%= render :partial => "partialpath", :object => :image %>

Вы заменили бы я изображением в вашем случае и частичным путем с тем, что вы называете частичным. Внутри частичного доступа он будет иметь доступ к локальной переменной с тем же именем, что и имя partials. Поэтому, если ваше имя частичного изображения является "изображением", то локальное переменное изображение будет объектом, в котором вы проходите.

EDIT: просмотр направляющих рельсов выглядит как в рельсах 3: объект теперь доступен как переменная экземпляра вместо локального, поэтому @image будет тем, что вы используете в частичном.