提问人:Michael Durrant 提问时间:8/4/2014 最后编辑:Michael Durrant 更新时间:8/4/2014 访问量:809
如何在jquery $.get调用后让rails用js更新页面?
How to get rails to update the page with js after a jquery $.get call?
问:
总结:调用来自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
$.get
verify_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)
答:
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=>[:en], :formats=>[:json], :handlers=>[:erb, :builder, :coffee, :haml]}. Searched in: * "/home/durrantm/Dropnot/webs/rails_apps/linker/app/views" </p>
0赞
Michael Durrant
8/5/2014
我尝试在控制器中切换到它,但它从未更新过“-spinner-”链接文本的页面。切换回格式.js至少会更新页面(尽管即使情况并非如此,也始终使用“未验证”)。
评论
{"id"=>"386&table_row=2"}