在Rails中使用Ajax传递部分数据

时间:2014-10-05 06:43:16

标签: javascript ruby-on-rails ruby ajax

我是rails的新手,我正在尝试做的是以下内容:

我正在创建一个商店并取消存储按钮以分别保存和“取消保存”该事件。我使用我的事件属性和当前用户来查找存储的事件。通过使用rails的ajax和远程功能,我可以将按钮的行为从存储更改为非存储,反之亦然。

在我的 _feed.html.erb

<% if @feed_items.any? %>
  <ul>
    <%= render partial: 'shared/feed_item', collection: @feed_items %>
  </ul>
<% end %>

每个@feed_items都包含一组数据(标题,类别等)。

在我的 _feed_item.html.erb

<li id="<%= feed_item.id %>" class="item">
    ...
    <div class="small-3 text-center columns">        
      <%= render 'shared/store_form', event: feed_item %>
    </div>
    ...
</li>

事件符号将该feed_item发送到store_form。

在我的 _store_form.html.erb

<div id="store_form_<%= event.id %>">
    <% if event.stored?(current_user) %>
        <%= render 'shared/unstore', event: event %>
    <% else %>
        <%= render 'shared/store', event: event %>
    <% end %>
</div>

我再次将feed_item传递给partial。

_store.html.erb

<%= form_for(event.storages.build(saver_id: current_user.id, 
                        organizer_id: event.user_id),
                        remote: true) do |f| %>
    <div>
        <%= f.hidden_field :organizer_id %>
        <%= f.hidden_field :saved_id, value: event.id %>
    </div>
  <%= f.submit "store" %>
<% end %>

_unstore.html.erb

<%= form_for(event.storages.find_by(saver_id: current_user.id,
                         organizer_id: event.user_id) ,
             html: { method: :delete },
             remote: true) do |f| %>
  <%= f.submit 'unstore' %>
<% end %>

create.js.erb

$("#store_form").html("<%= escape_javascript(render 'shared/store', event: event )%>")

destroy.js.erb

$("#store_form").html("<%= escape_javascript(render 'shared/unstore', event: event) %>")

点击存储/取消存储事件时,我收到了这些错误。

ActionView::Template::Error (undefined local variable or method `event' for #<#<Class:0x00000004d69be8>:0x00000004d68d10>):
    1: $("#store_form").html("<%= escape_javascript(render 'shared/unstore', event: event) %>")


ActionView::Template::Error (undefined local variable or method `event' for #<#<Class:0x00000004d69be8>:0x00000004fdc6a0>):
    1: $("#store_form").html("<%= escape_javascript(render 'shared/store', event: event )%>")

我的问题是,如何将特定的“事件”数据传递给部分。我不能将@feed_item用于创建和销毁js,因为feed_item具有一组事件。有没有更好的方法来处理这个?

1 个答案:

答案 0 :(得分:0)

在您的操作中,在控制器中创建和删除您应该实例化您的变量事件:通过@event更改事件并将您的js更改为:

$("#store_form").html("<%= escape_javascript(render 'shared/unstore') %>

因为你不需要添加实例化变量来渲染调用,rails正在为你做什么