如何将数据传递给部分?

时间:2010-11-02 06:30:20

标签: ruby-on-rails ruby

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 个答案:

答案 0 :(得分:17)

要将数据传递给部分,请使用locals选项。

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

然后在您的部分内容中,将其称为grinders而不是@grinders

但是,由于您在此处渲染集合,因此这是呈现集合的惯用方法:

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

这将查找名为'grinder.erb'的部分,并且将传递给partial的局部变量将是grinder(集合的奇异名称)。有了这个,你实际上可以摆脱部分中的循环语句。您也可以使用自定义名称,例如my_grinder,并将具有相同名称的本地变量传递给部分名称。

要了解更多信息,请仔细阅读:http://guides.rubyonrails.org/layouts_and_rendering.html

答案 1 :(得分:2)

在Rails 3中就像这样

<强> index.html.erb

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

<强> _product.html.erb

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

当使用复数集合调用partial时,partial的各个实例可以访问通过以partial命名的变量呈现的集合的成员。在这种情况下,partial是_product,在_product partial中,您可以引用product来获取正在呈现的实例

答案 2 :(得分:0)

尝试<%= render(:partial => "grinders/grinders", :object => @grinders) %>

答案 3 :(得分:0)

看起来你的投票#create动作试图处理“grinders / _grinders.html.erb”部分,这很奇怪,因为AJAX调用可能只输出JS或JSON。

您能告诉我们文件的内容:

  1. 应用程序/视图/票/ create.rjs.erb
  2. app / controllers / votes_controller.rb(特别是创建方法)