Rails Ajax - 渲染不同的部分

Posted

技术标签:

【中文标题】Rails Ajax - 渲染不同的部分【英文标题】:Rails Ajax - render different partial 【发布时间】:2018-05-10 04:38:22 【问题描述】:

我想通过 Ajax 调用提交帖子并使帖子从页面上消失。我无法弄清楚如何将它们连接在一起。我有一个包含待批准列表的页面,点击“批准”后,我希望帖子消失(我想我需要重新呈现所有待批准的帖子)。这是我的代码:

静态/_pending_approval.html.erb

%= link_to 'Approve', approve_post_path(pending_approval), class: 'btn btn-success btn-block', id: "approve_#pending_approval.id ", remote: true %>

posts_controller.rb

def approve
    authorize @post
    respond_to do |format|
      if @post.approved!
        format.html  redirect_to root_path, notice: 'Time entry has been approved' 
        format.js 
      else
        format.html  render action: "index" 
      end
    end
  end

这是我的问题。我不知道如何在不重新加载整页的情况下使帖子消失。我想我应该重新渲染我在“static/_admin.html.erb”中定义的部分'static/_pending_approval',它会渲染帖子列表。它看起来像这样:

'静态/_admin.html.erb'

<div class="pending-homepage row">
  <h2>Items Pending Your Approval</h2>
  <hr>
  <%= render partial: 'pending_approval', locals:  pending_approvals: @pending_approvals  %>
</div>

'静态/_pending_approval.html.erb'

<% pending_approvals.each do |pending_approval| %>
  <div class="homepage-block col-md-3">
    <h4>
      <%= pending_approval.user.full_name %>
    </h4>
    ...
    ...
    ...
<% end %>

我有'posts/approve.js.erb' 文件,看起来像这样:

$('.pending-homepage').html('<%= escape_javascript render ????? %>');

我怎样才能让它工作?

【问题讨论】:

$('.pending-homepage').hide() 不起作用? 但是 .pending-homepage 是我在其中呈现帖子列表的 div,我不想隐藏所有帖子,我想隐藏我批准的那个。 所以你可以创建一个 div 来包装 .homepage-block 并添加一个标识符,然后隐藏它。 好的,所以我有这个:&lt;div class="pending-homepage row" id="approval_2"&gt; 和approve.js.erb:$('#approval_&lt;%= @pending_approval.id %&gt;').hide(),但它会抛出一个错误ActionView::Template::Error (undefined method id' for nil:NilClass)` 【参考方案1】:

您可以向.homepage-block div 添加一个标识符,然后将其隐藏。

<% pending_approvals.each do |pending_approval| %>
  <div class="homepage-block col-md-3 pending-approval-"<%= pending_approval.id %>">
    <h4>
      <%= pending_approval.user.full_name %>
    </h4>
    ...
<% end %>

在js.erb文件中:

$(".pending-approval-"<%= @post.id %>").hide()

【讨论】:

是的,我有&lt;% pending_approvals.each do |pending_approval| %&gt; &lt;div class="homepage-block col-md-3" id="approval_&lt;%= pending_approval.id%&gt;"&gt; 和approve.js.erb:$('#approval_&lt;%= @pending_approval.id %&gt;').hide() 但它会抛出一个错误 ActionView::Template::Error (undefined method id' for nil:NilClass)@987654326 @@pending_approvals` 在 static_controller.rb 中定义,但 approve,js.erb 在 'posts/approve.js.erb' 中,所以它不知道 @pending_approval 是什么。 你能在approve中定义@pending_approval吗?或者任何可以使您在视图中的 div 和 js.erb 文件中具有相同值的东西? 是的,我刚刚意识到我需要在 PostsController 中定义的 @pending_approval 才能在approve.js.erb 中访问它。我会试一试。 当您在批准中使用@post 时,我认为这可能会给您pending_approval 的值,因为您正在使用响应批准方法的js 文件,您可以查看它是否可行返回一个包含 pending_approval id 的实例变量。 是的,我知道了! $('#approval_&lt;%= @post.id %&gt;').hide() 非常感谢!!!

以上是关于Rails Ajax - 渲染不同的部分的主要内容,如果未能解决你的问题,请参考以下文章

Rails 设计多态 - 使用 Ajax 获取部分渲染

Rails 4 使用 ajax、jquery、:remote => true 和 respond_to 渲染部分

通过渲染 Rails 部分创建 jquery html 对象

Rails 以不同的格式渲染动作

渲染部分 Rails3.x + coffeescript

内联 Javascript 在 Rails 3.1 上重新渲染部分 ruby​​ 时无法正常工作