在我的Rails 4应用中,我有一个Post
模型,其中包含自定义approval
属性。
当用户点击使用approval
设置的三个特定链接之一时,我尝试从帖子#显示页面更新此自定义remote: true
属性。
目标是仅重新加载显示此属性内容的部分,而不是整个页面。
以下是我的Post
show.html.erb
观点:
<div id="post_show_approval">
<%= render 'approval' %>
</div>
这是我的_approval.html.erb partial,位于app/views/posts
文件夹中:
<ul>
<li>
<% if @post.approval == "ok" %>
<span class="ok_green">
<span class="glyphicon glyphicon-ok"></span>
Post Approved
</span>
<% else %>
<span class="approval_blue" %>
<%= link_to post_path(:id => @post.id, "post[approval]" => "ok"), :class => "post_appoval_link", remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-ok"></span>
Approve this post
</span>
<% end %>
<% end %>
</li>
<li id="post_show_require_edits">
<% if @post.approval == "edit" %>
<span class="edit_yellow">
<span class="glyphicon glyphicon-repeat"></span>
This post requires edits
</span>
<% else %>
<span class="approval_blue" %>
<%= link_to post_path(:id => @post.id, "post[approval]" => "edit"), :class => "post_appoval_link", remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-repeat"></span>
Require edits for this post
</span>
<% end %>
<% end %>
</li>
<li id="post_show_to_be_deleted">
<% if @post.approval == "remove" %>
<span class="remove_red">
<span class="glyphicon glyphicon-remove"></span>
This post needs to be deleted
</span>
<% else %>
<span class="approval_blue" %>
<%= link_to post_path(:id => @post.id, "post[approval]" => "remove"), :class => "post_appoval_link", remote: true, :method => :patch do %>
<span class="glyphicon glyphicon-remove"></span>
Mark this post as to be deleted
<% end %>
</span>
<% end %>
</li>
</ul>
如您所见,post_approval_link
类的所有链接都设置为remote: true
。
然后,我更新了我的PostsController
,如下所示:
def update
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
我在update.js.erb
文件夹中创建了一个app/views/posts
文件:
$('#post_show_approval').reload(true);
- - - -
更新:作为上述行的替代品,我也尝试了
$('#post_show_approval').hide().show();
和
$('#post_show_approval').toggle().toggle();
但这些似乎都不起作用。
- - - -
更新2 :这是我尝试过的另一件事:
$('#post_show_approval').load('<%= j render "approval" %>');
但它也没有用。
- - - -
更新3 :当我只尝试
时$('#post_show_approval').hide();
或
$('#post_show_approval').toggle();
div确实消失了。
但我仍然没有办法让它重新出现并更新内容。
- - - -
更新4 :当我使用时:
$('#post_show_approval').append('<%= j render(partial: "approval") %>');
approval
部分会加载其更新的内容...初始内容不会消失,因此每次我们点击其中一个链接时,都会堆叠新的内容。
- - - -
但是,当我点击带有post_approval_link
类的三个链接之一时,帖子的appoval
属性实际上已更新为正确的值,但#post_show_approval
div是没有重新加载,我需要刷新页面才能看到实际的变化。
我在实施这个AJAX功能时缺少什么?
答案 0 :(得分:0)
问题在于我没有使用正确的JavaScript方法。
使用:
$('#post_show_approval').html('<%= j render(partial: "approval") %>');
它现在的工作就像一个魅力。