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

How to get rails to update the page with js after a jquery $.get call?

提问人:Michael Durrant 提问时间:8/4/2014 最后编辑:Michael Durrant 更新时间:8/4/2014 访问量:809

问:

总结:调用来自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 

链接验证 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 中完成(临时黑客),但我实际上希望像在verify_link.js.erb

但是,感觉好像在jquery调用后控制器没有调用(因此显示“DONE”的hack)。app/views/links/verify_link.js.erb$.getverify_link

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

服务器日志显示

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)
jQuery Ruby-on-Rails Ruby rspec unobtrusive-javascript

评论

0赞 Michael Durrant 8/4/2014
谢谢,我在问题底部添加了最新的输出。
0赞 Mandeep 8/4/2014
发送到服务器的 ID 有两件事,在控制器中,您有 Link.find(params[:id]),因此这可能会导致问题,但在您的日志中,您的用户和链接已正确加载。是否可以使用调试器验证是否正在加载正确的链接。此外,您的 js.erb 模板也会被渲染,因此您的 js 应该可以工作{"id"=>"386&table_row=2"}

答:

1赞 gabrimac 8/4/2014 #1

实现您想要的一种方法是在控制器返回@link中以 json 格式,在 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>');
  }
});

控制器中的响应可以如下所示: respond_to do |format| format.json { render json: @link.to_json } end

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

评论

0赞 Michael Durrant 8/4/2014
部分工作(更新数据库),但始终使用“未验证”更新 ui,除非我实际重新加载页面,在这种情况下,我会看到实际日期(因为数据库更新确实有效)。
0赞 Michael Durrant 8/4/2014
请更具体地介绍控制器。我尝试添加format.json,但只是出现错误 - 它导致了一个和500 Internal Server Error<h1>Template is missing</h1> <p>Missing template links/verify_link, application/verify_link with {:locale=&gt;[:en], :formats=&gt;[:json], :handlers=&gt;[:erb, :builder, :coffee, :haml]}. Searched in: * &quot;/home/durrantm/Dropnot/webs/rails_apps/linker/app/views&quot; </p>
0赞 Michael Durrant 8/5/2014
我尝试在控制器中切换到它,但它从未更新过“-spinner-”链接文本的页面。切换回格式.js至少会更新页面(尽管即使情况并非如此,也始终使用“未验证”)。