Javascript Rails 4:使用AJAX调用更新模型属性
这是关于和的后续问题。 我无法从我得到的好答案中找出如何使事情顺利进行,因此我想从头开始。 在我的Rails 4应用程序中,我有一个Javascript Rails 4:使用AJAX调用更新模型属性,javascript,jquery,ruby-on-rails,ajax,ruby-on-rails-4,Javascript,Jquery,Ruby On Rails,Ajax,Ruby On Rails 4,这是关于和的后续问题。 我无法从我得到的好答案中找出如何使事情顺利进行,因此我想从头开始。 在我的Rails 4应用程序中,我有一个日历和一个Post模型,设置了浅路线: resources :calendars do resources :posts, shallow: true end 日历有许多帖子,而帖子属于日历 在calendarshow.html.erb视图中,我显示了属于日历的所有帖子 从这个日历show.html.erb视图中,我需要使用AJAX调用更新帖子的:approv
日历
和一个Post
模型,设置了浅路线:
resources :calendars do
resources :posts, shallow: true
end
日历有许多帖子,而帖子属于日历
在calendarshow.html.erb
视图中,我显示了属于日历的所有帖子
从这个日历show.html.erb
视图中,我需要使用AJAX调用更新帖子的:approval参数,以便只刷新与此特定帖子的:approval相关的DOM元素,而不是整个页面
这是calendarshow.html.erb
中的代码部分,允许我更新帖子的:批准
:
<tr id="post_row_<%= post.id%>">
[...] # Truncated for brivety
<td class="cell_content_center post_approval_section">
<% if post.approval == "ok" %>
<span class="ok_green">
<% else %>
<span class="approval_blue" %>
<% end %>
<%= link_to post_path(:id => post.id, "post[approval]" => "ok", approval_update: true), remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-ok" data-toggle="tooltip" data-placement="left" title="Approve Post"></span>
<% end %>
</span><br/>
<% if post.approval == "edit" %>
<span class="edit_yellow">
<% else %>
<span class="approval_blue" %>
<% end %>
<%= link_to post_path(:id => post.id, "post[approval]" => "edit", approval_update: true), remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-repeat" data-toggle="tooltip" data-placement="left" title="Require Edits"></span>
<% end %>
</span><br/>
<% if post.approval == "remove" %>
<span class="remove_red">
<% else %>
<span class="approval_blue" %>
<% end %>
<%= link_to post_path(:id => post.id, "post[approval]" => "remove", approval_update: true), remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span>
<% end %>
</span>
</td>
[...] # Truncated for brivety
</tr>
注意:在这里,我不能使用默认的Posts#Update
操作,因为另一个AJAX调用已经使用它来更新postshow.html.erb
视图中的:approval
参数,这就是我们呈现Update\u post\u approval
自定义操作的原因
然后,我有以下app/views/posts/update\u post\u approval.js.erb
文件:
$("tr#post_row_#{post.id} > td.post_approval_section").html('<%= j render(partial: "calendars/post_approval") %>');
当我单击
部分中的三个链接中的一个来更新post:approval
参数时,该参数实际上已更新,正如我们在服务器日志中看到的:
Started PATCH "/posts/38?approval_update=true&post%5Bapproval%5D=ok" for ::1 at 2015-11-20 08:03:50 -0800
Processing by PostsController#update as JS
Parameters: {"approval_update"=>"true", "post"=>{"approval"=>"ok"}, "id"=>"38"}
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
Post Load (0.7ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 38]]
(0.6ms) BEGIN
SQL (1.1ms) UPDATE "posts" SET "approval" = $1, "updated_at" = $2 WHERE "posts"."id" = $3 [["approval", "ok"], ["updated_at", "2015-11-20 16:03:50.888587"], ["id", 38]]
SQL (1.3ms) INSERT INTO "versions" ("event", "object", "whodunnit", "created_at", "object_changes", "item_id", "item_type") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["event", "update"], ["object", "---\nid: 38\ncalendar_id: 6\ndate: 2015-11-17 22:09:00.000000000 Z\nsubject: Subject\nformat: Link\ncopy: https://www.wid.la/\ncreated_at: 2015-11-17 22:09:28.713416000 Z\nupdated_at: 2015-11-20 16:03:20.613597000 Z\nimage_file_name: \nimage_content_type: \nimage_file_size: \nimage_updated_at: \nshort_copy: ''\nscore: \nfacebook: true\ntwitter: false\ninstagram: false\npinterest: false\ngoogle: false\nlinkedin: false\ntumblr: \nsnapchat: \napproval: remove\n"], ["whodunnit", "1"], ["created_at", "2015-11-20 16:03:50.888587"], ["object_changes", "---\napproval:\n- remove\n- ok\nupdated_at:\n- 2015-11-20 16:03:20.613597000 Z\n- 2015-11-20 16:03:50.888587000 Z\n"], ["item_id", 38], ["item_type", "Post"]]
(1.6ms) COMMIT
Rendered calendars/_post_approval.html.erb (0.1ms)
Rendered posts/update_post_approval.js.erb (1.5ms)
Completed 200 OK in 27ms (Views: 9.9ms | ActiveRecord: 6.3ms)
但是,除非手动刷新页面,否则视图不会发生任何更改
我现在已经在这个问题上花了几个小时,不知道这个问题是由Ruby还是JS代码引起的
如果有必要,我很乐意分享更多的代码
你知道我做错了什么吗?错误在这里:
$(“tr#post(行){post.id}>td.post(批准)部分”).html(“”)
已更新
应该是:
$("tr#post_row_<%= @post.id %> > td.post_approval_section").html('<%= j render(partial: "calendars/post_approval", locals: {post: @post}) %>');
$(“tr#post_row_u>td.post_approval_section”).html(“”);
您是否可以尝试在app/views/posts/update\u post\u approval.js.erb文件中提供打印声明来打印帖子id,如果根据日志进行更新,则表示问题出在js文件上。对于js文件中非常微小的错误,js文件中编写的函数将不会执行。感谢您的回答。不幸的是,这似乎并不能解决问题。它导致服务器日志中出现问题:namererror-未定义的局部变量或方法
post'for#:app/views/posts/update\u post\u approval.js.erb:1:in\u app\u views\u posts\u update\u post\u js\u erb\u 1803217690360989333\u 70187072192720'
是的,我有疑问,请将post改为@post,并在partial:$(“tr#post_row_u>td.post_approval_section”).html(“”)中传递一个本地参数先生,你是个摇滚明星。它工作得很好,非常感谢你。很高兴它解决了你的问题,我自己也多次面对过这个问题。
Started PATCH "/posts/38?approval_update=true&post%5Bapproval%5D=ok" for ::1 at 2015-11-20 08:03:50 -0800
Processing by PostsController#update as JS
Parameters: {"approval_update"=>"true", "post"=>{"approval"=>"ok"}, "id"=>"38"}
User Load (1.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["id", 1]]
Post Load (0.7ms) SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 38]]
(0.6ms) BEGIN
SQL (1.1ms) UPDATE "posts" SET "approval" = $1, "updated_at" = $2 WHERE "posts"."id" = $3 [["approval", "ok"], ["updated_at", "2015-11-20 16:03:50.888587"], ["id", 38]]
SQL (1.3ms) INSERT INTO "versions" ("event", "object", "whodunnit", "created_at", "object_changes", "item_id", "item_type") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id" [["event", "update"], ["object", "---\nid: 38\ncalendar_id: 6\ndate: 2015-11-17 22:09:00.000000000 Z\nsubject: Subject\nformat: Link\ncopy: https://www.wid.la/\ncreated_at: 2015-11-17 22:09:28.713416000 Z\nupdated_at: 2015-11-20 16:03:20.613597000 Z\nimage_file_name: \nimage_content_type: \nimage_file_size: \nimage_updated_at: \nshort_copy: ''\nscore: \nfacebook: true\ntwitter: false\ninstagram: false\npinterest: false\ngoogle: false\nlinkedin: false\ntumblr: \nsnapchat: \napproval: remove\n"], ["whodunnit", "1"], ["created_at", "2015-11-20 16:03:50.888587"], ["object_changes", "---\napproval:\n- remove\n- ok\nupdated_at:\n- 2015-11-20 16:03:20.613597000 Z\n- 2015-11-20 16:03:50.888587000 Z\n"], ["item_id", 38], ["item_type", "Post"]]
(1.6ms) COMMIT
Rendered calendars/_post_approval.html.erb (0.1ms)
Rendered posts/update_post_approval.js.erb (1.5ms)
Completed 200 OK in 27ms (Views: 9.9ms | ActiveRecord: 6.3ms)
$("tr#post_row_<%= @post.id %> > td.post_approval_section").html('<%= j render(partial: "calendars/post_approval", locals: {post: @post}) %>');