Javascript Rails 4:使用AJAX调用更新模型属性

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

这是关于和的后续问题。

我无法从我得到的好答案中找出如何使事情顺利进行,因此我想从头开始。

在我的Rails 4应用程序中,我有一个
日历
和一个
Post
模型,设置了浅路线:

resources :calendars do
  resources :posts, shallow: true
end
日历
有许多
帖子,而帖子
属于日历

在calendar
show.html.erb
视图中,我显示了属于日历的所有帖子

从这个日历
show.html.erb
视图中,我需要使用AJAX调用更新帖子的:approval参数,以便只刷新与此特定帖子的:approval相关的DOM元素,而不是整个页面

这是calendar
show.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调用已经使用它来更新post
show.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}) %>');