Rails 4 x AJAX:部分未在使用远程点击时重新加载:true

时间:2015-11-18 23:22:30

标签: javascript jquery ruby-on-rails ajax ruby-on-rails-4

在我的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功能时缺少什么?

1 个答案:

答案 0 :(得分:0)

问题在于我没有使用正确的JavaScript方法。

使用:

$('#post_show_approval').html('<%= j render(partial: "approval") %>');

它现在的工作就像一个魅力。