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 以及您所在的页面。
说,我在“/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 以及您所在的页面。