在jquery $ .get调用之后如何让rails用js更新页面?

时间:2014-08-03 18:57:36

标签: jquery ruby-on-rails ruby rspec unobtrusive-javascript

摘要:当来自js?

的呼叫时,如何更新原始页面?

这个原始的erb链接有效:

链接视图

# app/views/links/index.html.haml
= link_to 'verify', verify_link_path(id: link.id, table_row: index),
  class: 'verify',  title: 'Verify this link', remote: true

链接控制器

  def verify_link
    @link = Link.find(params[:id])
    if @link.valid_get?
      @link.update_attribute(:verified_date, Time.now)
    end 
    respond_to do |format|
      format.js
    end 
  end 

links验证js erb

# app/views/links/verify_link.js.erb 
<%- if @link.verified_date %>
  $("span#verify_link_<%=params['table_row']%>").html('<span class="done">Verified</span>');
<%- else %>
  $("span#verify_link_<%=params['table_row']%>").html('<span class="undone">Unverified</span>');
<%- end %>

效果很好,因为它显示已验证或未验证的

我已切换到使用js:

链接视图:

%a{href: "#", :data => {verifying_link: 'yes', id: link.id, table_row: index}}
  verify_via_js

链接验证链接js:

# app/assets/javascripts/verifying_link.js.erb

$(function(){
  $("a[data-verifying-link]='yes'").click(function(){
    // spinner here
    a=$(this).parent()
    a.html('-spinner-')
    var id= $(this).data("id");
    var row = $(this).data("tableRow");
    $.get("/verify_link/"+id+"&table_row="+row);
    a.html('DONE') // temp hack
  }); 
});

记录获取数据库中的更新,我在ui(临时黑客)中获得了DONE但我实际上希望在verify_link.js.erb

中完成原始验证/未验证的工作

但是,在jquery app/views/links/verify_link.js.erb调用$.get之后,控制器没有调用verify_link(因此黑客显示'DONE')。

如果我刷新浏览器页面,我看到日期已更新。

服务器日志显示

Started GET "/verify_link/386&table_row=2" for 127.0.0.1 at 2014-08-03 15:14:50 -0400
Processing by LinksController#verify_link as */*
  Parameters: {"id"=>"386&table_row=2"}
  User Load (0.2ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` = 2 LIMIT 1
  Link Load (0.4ms)  SELECT `links`.* FROM `links` WHERE `links`.`id` = 386 LIMIT 1
   (0.3ms)  BEGIN
   (0.6ms)  UPDATE `links` SET `verified_date` = '2014-08-03 19:14:51', `updated_at` = '2014-08-03 19:14:51' WHERE `links`.`id` = 386
   (0.7ms)  SELECT COUNT(*) FROM `links` WHERE (1 = 1 AND position = 354)
   (61.5ms)  COMMIT
  Rendered links/verify_link.js.erb (0.1ms)
Completed 200 OK in 868.2ms (Views: 2.4ms | ActiveRecord: 63.7ms)

1 个答案:

答案 0 :(得分:1)

执行所需操作的方法是在控制器中以json格式返回@link,并在您的verifying_link.js.erb文件中,您必须修改ajax函数:

$.get("/verify_link/"+id+"&table_row="+row, function(data) {
  if (data.link.verified_date !== undefined) {
   $("span#verify_link_"+row).html('<span class="done">Verified</span>');
  } else {
   $("span#verify_link_"+row).html('<span class="undone">Unverified</span>');
  }
});

$.get("/verify_link/"+id+"&table_row="+row, function(data) { if (data.link.verified_date !== undefined) { $("span#verify_link_"+row).html('<span class="done">Verified</span>'); } else { $("span#verify_link_"+row).html('<span class="undone">Unverified</span>'); } });

控制器中的响应可以是这样的:

在此解决方案中,您不需要文件verify_link.js.erb