在rails中调用ajax后,页面不显示更新的信息

时间:2011-12-19 18:11:08

标签: jquery ruby-on-rails ajax ruby-on-rails-3 unobtrusive-javascript

我有rails 3.1,当我使用ajax进行删除操作时,如果没有手动刷新,页面就不会显示更新的内容。

奇怪的是,所有.js.erb代码似乎都正常启动。我甚至尝试在destroy.js.erb中添加一个简单的page.alert('hi'),但删除后我没有收到任何警报。我看到有几个地方他们提到在视图中为ajax添加一个“script”标签以使jquery工作,但没有一个最新的教程提到这一点。我将非常感谢你的帮助。

以下是我在服务器日志中看到的内容:

Started DELETE "/categories/35" for 127.0.0.1 at 2011-12-19 12:58:15 -0500
  Processing by CategoriesController#destroy as JS
  Parameters: {"id"=>"35"}
  User Load (0.2ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 5 LIMIT 1
  Category Load (0.3ms)  SELECT "categories".* FROM "categories" WHERE "categories"."user_id" = 5 AND "categories"."id" = ? LIMIT 1  [["id", "35"]]
  SQL (0.5ms)  DELETE FROM "categories" WHERE "categories"."id" = ?  [["id", 35]]
Rendered categories/destroy.js.erb (0.5ms)
Completed 200 OK in 161ms (Views: 30.7ms | ActiveRecord: 3.2ms)

以下是我在生成的html页面输出页面源中看到的内容:

...
 <tr id = "category_35">
    <td>High-end products</td>
    <td class="deletebutton"><a href="/categories/35" data-confirm="Are you sure?" data-method="delete" data-remote="true" rel="nofollow">Delete</a></td>
  </tr>

 <tr id = "category_36">
    <td>Economy products</td>
    <td class="deletebutton"><a href="/categories/36" data-confirm="Are you sure?" data-method="delete" data-remote="true" rel="nofollow">Delete</a></td>
  </tr>

destroy.js.erb的内容:

('#<%= dom_id(@category) %>').fadeOut(700);

在Gemfile中:

gem 'jquery-rails'

在categories_controller.rb中:

  def index
      @categories = current_user.categories.all
    respond_to do |format|
      format.html # index.html.erb
      format.json 
      format.js
    end
  end

  def destroy
      @category.destroy

    respond_to do |format|
        format.html { redirect_to categories_url }
        format.js { 
            render :template => 'categories/destroy.js.erb', :layout => false 
        }
    end
  end

在app / views / categories / index.html.erb

<h2>Categories</h2>
<table name="categories_list">
<%= render "categories_list" %>
</table>    
<br />

在部分_categories_list.html.erb

<% @categories.each do |category| %>
  <tr id = "<%= dom_id(category)%>">
    <td><%= category.name %></td>

    <td class="deletebutton"><%= link_to 'Delete', category, confirm: 'Are you sure?', method: :delete, :remote => true  %></td>
  </tr>
<% end %>

1 个答案:

答案 0 :(得分:1)

好的,万一有人偶然发现这个问题,我想分享解决方案。大约有三件重要的事情:

  1. destroy.js.erb中的$符号丢失了。这是更正后的代码:

    $('#&lt;%= dom_id(@category)%&gt;')。fadeOut(700);

  2. 此外,必须指示控制器在响应.js时不使用默认布局。这可以在applcation控制器本身完成。但我在类别控制器中做了如下:

    respond_to do | format |     format.html {redirect_to categories_url}     format.json     format.js {render“destroy”,:layout =&gt;假}

  3. 此外,在迭代期间的某个时刻,我将format.json与format.js混淆了。他们是两个不同的东西!因为,我是RoR的新手,我认为对ajax调用的响应将是json,而format.json类似于format。 JS。

  4. 最后,我应该向Mark发表评论,他在github上分享了一个ajax演示: https://github.com/markusproske/ajax_demo/tree/jquery

    为了让它适用于我,我必须做的额外更改是禁用布局再现。否则,该演示是彻底的。我仍然在寻找处理js调用的错误条件。