Как передать данные в частичное? - PullRequest
5 голосов
/ 02 ноября 2010

K ребята, поэтому я создал этот скрипт голосования вверх / вниз (в основном, как здесь, на stackoverflow), и я пытаюсь добавить к нему немного Ajax, чтобы страница не перезагружалась при каждом голосовании.

У меня есть два контроллера, один называется дробилкой, а другой называется голосованием.(Измельчители - это в основном сообщения)

Итак, вот индекс всех измельчителей (выглядит так) Screenshot.

и вот код этой страницы.

</head>
<body>
 <h1>Listing grinders</h1>

 <%= render(:partial => "grinders/grinders")%>
<br />

<%= link_to 'New grinder', new_grinder_path %>
</body>
</html>

и это то, что у меня есть в views / grinders / _grinders.erb

<% @grinders.each do |grinder| %>

<div id="main">
    <div style="float:left; height:80px; width:50px">
        <div class='up'>
            <% form_for(@vote, :remote => true) do |u|%>
                <%= u.hidden_field :grinder_id, :value => grinder.id %>
                <%= u.hidden_field :choice, :value => "up" %>
                <%= image_submit_tag("http://i13.photobucket.com/albums/a287/Rickmasta185/arrow-small-green-up.png", :class => 'create') %>

            <% end %>  
        </div>
        <center><%= grinder.votes_sum %></center>
        <div class='down'>
            <% form_for(@vote, :remote => true) do |d|%>
                <%= d.hidden_field :grinder_id, :value => grinder.id %>
                <%= d.hidden_field :choice, :value => "down" %>
                <%= image_submit_tag("http://i13.photobucket.com/albums/a287/Rickmasta185/arrow-small-red-down.png", :class => 'create') %>
            <% end %>  
        </div>

    </div>


    <div class='box' >"<strong>It grinds our gears </strong><%=h grinder.grinder %>"</div>



 </div>
</div>

<% end %>

Но каждый раз, когда я пытаюсь проголосовать за одного, я получаю следующую ошибку:

У вас есть нулевой объект, когда вы его не ожидали!Возможно, вы ожидали экземпляр Array.Произошла ошибка при оценке nil.each Screenshot of error. Я пробовал слишком много вещей, и я просто не могу заставить его работать!(Увеличенный скриншот - http://grab.by/7bgb)

Любая помощь? Если вам нужна дополнительная информация, просто спросите!

Ответы [ 4 ]

17 голосов
/ 02 ноября 2010

Для передачи данных в партиал используйте опцию locals.

<%= render(:partial => "grinders/grinders", :locals => {:grinders => @grinders})%>

А затем в партиале укажите его как grinders, а не @grinders.

Однако, поскольку вы визуализируете коллекцию здесь, это идиоматический способ визуализации коллекции:

<%= render :collection => @grinders %>

Это будет искать часть с именем grinder.erb и локальныйпеременная, которая будет передана в частичное, будет grinder (единственное имя для коллекции).С этим вы можете фактически избавиться от оператора цикла в своей части.Вы также можете использовать произвольное имя, скажем, my_grinder, и локальная переменная с тем же именем будет передана в частичное.

Чтобы узнать больше, пройдите по этому: http://guides.rubyonrails.org/layouts_and_rendering.html

2 голосов
/ 27 июня 2013

В Rails 3 это так

index.html.erb

<h1>Products</h1>
<%= render :partial => 'product', :collection => @products %>

_product.html.erb

<p>Product Name: <%= product.name %></p>

Когда частичное вызывается с множественной коллекцией, то отдельные экземпляры частичного имеют доступ к члену коллекции, отображаемой через переменную, названную в честь частичного. В этом случае частичным является _product, а в частичном _product вы можете обратиться к продукту, чтобы получить экземпляр, который отображается

0 голосов
/ 02 ноября 2010

Кажется, что ваше действие Votes # create пытается обработать частичку "grinders / _grinders.html.erb", что странно, потому что вызовы AJAX, скорее всего, будут выводить только JS или JSON.

Можете ли вы показать нам содержимое файлов:

  1. Приложение / просмотров / голоса / create.rjs.erb
  2. app / controllers / voice_controller.rb (особенно метод create)
0 голосов
/ 02 ноября 2010

Попробуйте <%= render(:partial => "grinders/grinders", :object => @grinders) %>

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...