Javascript Rails 4:使用AJAX仅更新一个参数的自定义操作
在我的Rails 4应用程序中,我有一个日历和一个Post模型,使用浅路线: 日历上有许多帖子,帖子属于日历 我已经在post show.html.erb视图中对PostsUpdate操作使用AJAX调用来更新帖子的custom:approval参数: 我的PostsUpdate控制器中有respond_to do | format | format.js end 我在app/views/posts/中有一个update.js.erb视图来重新加载post show.html.erb视图的相应部分 当然,我的链接设置为remote:true 现在,我需要实现一个类似的功能,来更新帖子的custom:approval参数,但是要从calendar show.html.erb视图中更新所有帖子 这是我当前在calendar show.html.erb视图中的内容: 当我单击其中一个链接以更新后期审批时,浏览器中不会发生任何事情 但是,在log/development.log中,我有: 我做错了什么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模型,使用浅路线: 日历上有许多帖子,帖子属于日历 我已经在post show.html.erb视图中对PostsUpdate操作使用AJAX调用来更新帖子的custom:approval参数: 我的PostsUpdate控制器中有respond_to do | format | format.js end 我在app/views/posts/中有一个update.js.erb视图来重新加载post show.html.erb视图的相应部
-----我认为您应该能够通过js.erb中的一个条件做到这一点:
<% if @post.approval === 'ok' %>
$('td.post_approval_section').replaceWith("<%= j render(:partial => 'calendar/approval') %>");
<% else %>
// you current update post code
<% end %>
同时将代码移动到_approval.html.erb
希望这能有所帮助。我想出了两个办法来处理这种情况: 第一种方法:当您从calendar show.html.erb更新帖子时,传入另一个参数,因此指向的链接将是: 现在,当您从Calendar show.html.erb更新帖子时,帖子控制器将加载RAILS\u ROOT/app/views/posts/update\u Post\u approval.js.erb而不是update.js.erb
第二种方法:为更新Post的approval属性创建另一个路由,这意味着您还将在Post controller中创建另一个操作,以处理日历页面中的AJAX更新情况。感谢您的回答,这对经验丰富的人来说必须是有意义的。因为我是新手,我不得不说我很困惑。我在app/views/posts中已经有一个“_approval.html.erb”文件。还有,你应该把什么代码放在你说的地方//you current update post code?非常感谢。我正在尝试第一种方法。有没有办法选择在PostsUpdate控制器中调用哪个.js.erb文件?谢谢您的添加。然后,我猜,在update_post_approval.js.erb中,我用类post_approval_部分重新加载与div对应的部分,对吗?此外,我是否需要为新的更新发布审批创建新路线?谢谢。我刚刚更新了我的问题来说明我现在的处境。你有没有可能看一下,让我知道这个代码还有什么问题?嘿@ThibaudClement,你忘了在链接中把审批更新传递给post路径。应该是post.id,post[approval]=>ok,approval\u update:true,remote:true,:method=>:patch do%>让我们来看看。
<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"), 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"), 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"), remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span>
<% end %>
</span>
</td>
#calendars/show.html.erb and calendars/_post_approval.html.erb
<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"), remote: true, approval_update: 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"), remote: true, approval_update: 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"), remote: true, approval_update: true, :method => :patch do %>
<span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span>
<% end %>
</span>
</td>
#posts_controller.rb
def update
if params["approval_update"]
respond_to do |format|
format.js { render :action => "update_post_approval" }
end
else
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to post_path(@post) }
format.json { render :show, status: :ok, location: @post }
format.js
else
format.html { render :edit }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
end
def update_post_approval
respond_to do |format|
format.js
end
end
#update_post_approval.js.erb
$('td.post_approval_section').html('<%= j render(partial: "calendars/post_approval") %>');
Started PATCH "/posts/42?post%5Bapproval%5D=edit" for ::1 at 2015-11-19 19:59:51 -0800
Processing by PostsController#update as JS
Parameters: {"post"=>{"approval"=>"edit"}, "id"=>"42"}
[1m[36mUser Load (1.1ms)[0m [1mSELECT "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT 1[0m [["id", 1]]
[1m[35mPost Load (2.2ms)[0m SELECT "posts".* FROM "posts" WHERE "posts"."id" = $1 LIMIT 1 [["id", 42]]
[1m[36m (1.1ms)[0m [1mBEGIN[0m
[1m[35mSQL (1.1ms)[0m UPDATE "posts" SET "approval" = $1, "updated_at" = $2 WHERE "posts"."id" = $3 [["approval", "edit"], ["updated_at", "2015-11-20 03:59:51.203371"], ["id", 42]]
[1m[36mSQL (3.6ms)[0m [1mINSERT INTO "versions" ("event", "object", "whodunnit", "created_at", "object_changes", "item_id", "item_type") VALUES ($1, $2, $3, $4, $5, $6, $7) RETURNING "id"[0m [["event", "update"], ["object", "---\nid: 42\ncalendar_id: 8\ndate: 2015-11-19 20:19:00.000000000 Z\nsubject: Armistice 2\nformat: Image\ncopy: Joyeux 11 novembre tout le monde. ++\ncreated_at: 2015-11-19 20:19:58.244685000 Z\nupdated_at: 2015-11-20 03:59:44.073894000 Z\nimage_file_name: armistice.jpg\nimage_content_type: image/jpeg\nimage_file_size: 35967\nimage_updated_at: 2015-11-19 20:19:57.792047000 Z\nshort_copy: etg'tg' <<\nscore: \nfacebook: true\ntwitter: true\ninstagram: false\npinterest: false\ngoogle: false\nlinkedin: false\ntumblr: \nsnapchat: \napproval: ok\n"], ["whodunnit", "1"], ["created_at", "2015-11-20 03:59:51.203371"], ["object_changes", "---\napproval:\n- ok\n- edit\nupdated_at:\n- 2015-11-20 03:59:44.073894000 Z\n- 2015-11-20 03:59:51.203371000 Z\n"], ["item_id", 42], ["item_type", "Post"]]
[1m[35m (2.0ms)[0m COMMIT
Rendered posts/_approval.html.erb (0.6ms)
Rendered posts/update.js.erb (2.1ms)
Completed 200 OK in 59ms (Views: 10.9ms | ActiveRecord: 11.1ms)
<% if @post.approval === 'ok' %>
$('td.post_approval_section').replaceWith("<%= j render(:partial => 'calendar/approval') %>");
<% else %>
// you current update post code
<% end %>
<% if post.approval == "ok" %>
<span class="ok_green">
<% else %>
<span class="approval_blue" %>
<% end %>
<%= link_to post_path(:id => post.id, "post[approval]" => "ok"), 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"), 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"), remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-remove" data-toggle="tooltip" data-placement="left" title="To Be Deleted"></span>
<% end %>
</span>
<%= link_to post_path(:id => post.id, "post[approval]" => "remove", approval_update: true), remote: true, :method => :patch do %>
if params["approval_update"]
respond_to do |format|
format.js { render :action => "update_post_approval" }
end
else
respond_to do |format|
...
end
end