【问题标题】:Rails Redirect fails after delete. (Delete is successful but display of remaining records does not happen)删除后 Rails 重定向失败。 (删除成功但不显示剩余记录)
【发布时间】:2014-11-13 05:19:50
【问题描述】:

当用户调用 users_path 视图时,所有用户都会在显示中正确呈现。

但是,删除后我也会重定向到索引。控制台显示 200 Ok 但未呈现索引。

尝试单步执行一些 rails 代码,看起来在删除之后,rails 会进行隐式渲染。在调用索引视图的第一种情况下,它不会这样做。

views/users/index.rb

<% @users.each do |user| %>
<tr class = '<%=cycle('dataeven', 'dataodd')%>' > 
<td class = '<%=cell_class%>'><%= user.username %></td>
<td <class = '<%=cell_class%>'><%= user.email %></td>
<td class = '<%=cell_class%>'><%= user.actual_name %></td>
<td class = '<%=link_cell_class%>'><%= tlink_to 'edit_permissions', permissions_path(user) %></td>
<td class = '<%=link_cell_class%>'><%= tlink_to 'reset_password', edit_password_path(user) %></td>
<td class = '<%=link_cell_class%>'><%= unlock_link(user) %></td>
<td class = '<%=link_cell_class%>'><%= tlink_to("destroy", destroy_user_path(user), {:navigate=>false, :method=>'delete', :remote=>true, :data=>{:confirm=>tmessage( 'delete.are_you_sure', $W, {:model=>user.username}) }})%></td>
</tr>
<%end%>
</table>
<%= twill_paginate %>
<br>

<%= link_to t('headings.new.heading', :model=> t($ARM + 'user', :count=>1)), new_user_path %> | <%= tlink_to "new_invitation", new_user_invitation_path%></li>

users_controller.rb

def index
  @users = User.paginate :page => params[:page], :per_page => 15
  respond_to do |format|
    format.html 
    format.xml  { render :xml => @translation_languages }
  end
end

..... users_controller.rb ...

def destroy    
  @user.destroy
  tflash('delete', :success, {:model=>@@model, :count=>1})
  respond_to do |format|
    format.html { redirect_to(users_url) }
    format.xml  { head :ok }
  end
end

有没有人知道什么可能导致重定向到静默停止

【问题讨论】:

  • 看一下日志,看看能不能看到请求的格式。如果不是 html,则不会命中重定向。

标签: ruby-on-rails redirect activerecord actionpack


【解决方案1】:

两个问题可能会帮助您找到解决方案:

  1. tflash 方法的内容是什么? (如果你把它注释掉,它会起作用吗?)
  2. 为什么您的销毁操作会响应 xml?

【讨论】:

  • tflash 只是 Flash 的翻译包装器。我会调查一下,看看那里是否有问题。没有理由使用 xml。我会删除它。
【解决方案2】:

我看到链接是远程的 - 这将是 js 格式。

这样做:

创建一个destroy.js.erb文件,和index.js放在同一个目录下。 例如,您可以在其中执行 javascript - 删除元素

在views/users/destroy.js.erb中

$("##{dom_id(user)}").remove()

在视图中,将其添加到用户行:

<tr class = '<%=cycle('dataeven', 'dataodd')%> <%= dom_id(user) %>' > 

编辑

您也可以只删除遥控器:true。应该提到这一点。

【讨论】:

  • 这将是一个软糖。所有其他控制器都可以在没有此类问题的情况下进行删除。此控制器中的销毁操作有问题。从数据库中删除记录,读取视图并用正确的数据填充。发送了 200 代码,但屏幕从不绘制。
  • 如果您查看日志,它会尝试渲染 destroy.js(未找到模板)?你的意思是在里面有 remote true 吗?
【解决方案3】:

谢谢大家的建议。

解决方案非常明显:该应用程序中的所有其他删除都涉及在删除后完全刷新索引页面。不管什么原因,我在这个里面放了一个remote: true 然后没有放任何js来处理html中被删除的行。

所以现在在 users_controller.rb 中

 def destroy
  @user.destroy
  tflash('delete', :success, {:model=>@@model, :count=>1, :now=> true})
  respond_to do |format|
    format.html { redirect_to(users_url) }
    format.js {}
  end
end

在 users/index.html.erb 中

<tr class = '<%=cycle('dataeven', 'dataodd')%>' id = '<%= dom_id(user)%>' >     
  <td class = '<%=link_cell_class%>'><%= tlink_to("destroy", destroy_user_path(user), {:navigate=>false, :method=>'delete', :remote=>true, :data=>{:confirm=>tmessage( 'delete.are_you_sure', $W, {:model=>user.username}) }})%></td>

在views/users/destroy.js.erb中

$('#user_<%=@user.id %>').remove();

我将把我所有的删除都改成用这种方式使用 ajax。

【讨论】:

  • 哈 - 就像我 5 天前给你的答案一样。干得好!
猜你喜欢
  • 1970-01-01
  • 2014-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-02
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
相关资源
最近更新 更多