在我的Rails 4的应用程序,我有一个Calendar
和Post
机型,采用shallow
路线:轨道4:自定义操作只更新PARAM与AJAX
resources :calendars do
resources :posts, shallow: true
end
日历has_many
后和后belong_to
一个日历。
我已经在后show.html.erb
视图中使用的Posts#Update
动作AJAX调用更新后的自定义:approval
PARAM:在我Posts#Update
控制器
- 我
respond_to do |format| format.js end
- 我有一个
update.js.erb
查看在app/views/posts/
重新加载相应部分的帖子show.html.erb
查看 - 当然,我的链接设置为
remote: true
现在,我需要实现类似的功能,更新后的定制:approval
PARAM,但其中显示的所有职位日历show.html.erb
视图。
这是目前我已经在我的日历show.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, :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>
此代码可以让我真正从日历show.html.erb
更新后的自定义:approval
PARAM。
但我不知道如何重新加载页面,甚至更好,只需重新加载链接所在的post_approval_section
td
。
我不能再用我的后show.html.erb
使用完全相同的方法,因为我已经为Posts#Update
行动建立一个JS响应。
我该如何做这项工作?
-----
UPDATE:基于长阮答案,这里是我现在在哪儿。
#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") %>');
当我点击其中一个链接更新后批准,浏览器中没有任何反应。
但是,log/development.log
,我有:
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)
我在做什么错在这里?
-----
非常感谢。我正在尝试**第一种方式**。有没有办法可以选择在Posts#Update控制器中调用哪个.js.erb文件? –
感谢您的加入。然后,我猜,在'update_post_approval.js.erb'中,我重新加载了与类post_approval_section相对应的div的部分,究竟是什么?另外,我是否需要为新的'update_post_approval'创建一个新路线? –
是的,您可以通过'.js.erb'轻松操作DOM。 –