Ruby on Rails 6. 重定向后使用 Ajax

Ruby on Rails 6. Using Ajax after redirection

说,我在“/users”页面上有用户列表,'user' 实体有 2 个操作:“index”(使用 Ajax) 和'销毁'。

  def index
      ...    
      respond_to do |format|
        format.html
        format.js
      end
  end

  def destroy
    ...    
    redirect_to users_url
  end

我想销毁一个用户(直接从'/users'页面)然后使用'index'操作的Ajax('index.js.erb' 文件)以便仅呈现打开的“/users”页面的一部分。

可以吗?


我目前的解决方案是将 Ajax 用于 'destroy' 操作(一个单独的 'destroy.js.erb' 文件)并复制 'index' 页面所需的更改。但是,首先,这是一个代码重复,其次,在这种情况下,我的分页链接被破坏了(我使用 'Kaminari' gem 并且看起来它只适用于 'get' 请求,至少默认情况下)。


更新有'view'部分Ajax,如有必要:

   <div id="users_table">     
      <table class="table table-hover table-borderless">
        ...
        <tbody>
          <%= render @users %>
        </tbody>
      </table>
    
      <div><%= paginate @users, remote: true %></div>
   </div> 

您的 destroy.js.erb 应该(在成功销毁后)通过删除 HTML 的一部分从索引中删除被销毁的元素。我不希望执行此操作的代码与索引视图中的代码重复。

Post 您当前的 destroy.js.erb 以及 index.html.erb 的相关部分以获得更多帮助。

您还可以在 respond_to 中使用重定向,这样您的 HTML 调用将重定向,而 Ajax 使用 destroy.js.erb

respond_to do |format|
  format.js
  format.html { redirect_to users_url}

您也可以通过调用 render :index 获取 js 响应来破解您的答案。但是,如果您尝试在此处呈现索引视图,您肯定会得到重复的代码,以及额外的数据库调用和可能出现的分页错误。因此,我建议您采用我首先建议的方法(使用 destroy.js.erb 从 HTML 中删除该用户)

最后,更一般地说,当您试图避免重复视图代码时;部分可能是答案

如果你想让 destroy 动作渲染 index.js.erb:

def destroy
  ...
  respond_to do |format|
    format.js { render action: :index}
    format.html { redirect_to users_url}
  end
end

但是,要呈现 index.js,您需要在销毁操作中重建 @users 对象,并确保为正确的页面重建它。因此,当您调用销毁操作时,您需要传递要销毁的用户的 ID 以及您所在的页面。