我遇到了一个问题,删除方法没有触发我的控制器中指定的重定向。我正在使用Rails 7.0.4和Ruby 3.1.2
雇员_控制器.rb
def destroy
@employee.destroy
respond_to do |format|
format.html { redirect_to root_path, notice: "Employee was deleted" }
format.turbo_stream { flash.now[:notice] = "Employee was deleted" }
end
end
_雇员.html.erb
<%= turbo_frame_tag "employees" do %>
<%= render employees %>
<% end %>
_雇员.html.erb
<div id="<%= dom_id employee %>">
<div class="index bg-white dark:bg-gray-900 px-4 md:px-10">
<div class="overflow-x-auto">
<table class="w-full whitespace-nowrap">
<tbody>
<tr tabindex="0" class="focus:outline-none text-sm leading-none text-gray-600 dark:text-gray-200 h-16">
<td class="w-1/2">
<div class="flex items-center">
<div class="w-10 h-10 rounded-sm flex items-center justify-center">
<p class="text-xs font-bold leading-3 text-white"><%= gravatar_for employee %></p>
</div>
<div class="pl-2">
<p><%= link_to "#{employee.first_name} #{employee.last_name}", employee_path(employee, employee), class: "text-sm font-medium leading-none text-gray-800 dark:text-white"%></p>
<p class="text-xs leading-3 text-gray-600 dark:text-gray-200 mt-2"><%= employee.email %></p>
</div>
</div>
</td>
<td class="pl-8">
<p>
<%= link_to "View", employee_path(employee, employee), type: "button",
class: "inline-block px-6 py-2.5 bg-blue-600 text-white font-medium text-xs leading-tight uppercase rounded shadow-md hover:bg-blue-700 hover:shadow-lg
focus:bg-blue-700 focus:shadow-lg focus:outline-none focus:ring-0 active:bg-blue-800 active:shadow-lg transition duration-150 ease-in-out" %>
</p>
</td>
<td class="pl-8">
<p>
<%= link_to "Edit", edit_employee_path(employee, employee), type: "button",
class: "inline-block px-6 py-2.5 bg-yellow-600 text-white font-medium text-xs leading-tight uppercase rounded shadow-md hover:bg-yellow-700 hover:shadow-lg
focus:bg-yellow-700 focus:shadow-lg focus:outline-none focus:ring-0 active:bg-yellow-800 active:shadow-lg transition duration-150 ease-in-out" %>
</p>
</td>
<td class="pl-8">
<p>
<%= link_to "Delete", employee_path(employee), data: { turbo_method: :delete, turbo_confirm: 'Are you sure?' }, type: "button",
class: "inline-block px-6 py-2.5 bg-red-600 text-white font-medium text-xs leading-tight uppercase rounded shadow-md hover:bg-red-700 hover:shadow-lg
focus:bg-blue-700 focus:shadow-lg focus:outline-none focus:ring-0 active:bg-blue-800 active:shadow-lg transition duration-150 ease-in-out" %>
</p>
</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
我甚至录制了一个快速织机展示缺乏重定向的行动:https://www.loom.com/share/e2c333e54fb84b9193c07b54a3546d54
1条答案
按热度按时间rqenqsqc1#
编辑
下面的回答是固执己见:我假设你想使用Turbo帧/流,因为你把你的雇员放在一个“雇员”Turbo帧中,而且你在你的控制器中有一个turbo_stream方法。
虽然它并没有明确回答你的问题。当你点击一个员工时,URL会发生变化,这是需要调查的。
请共享您的
show.html.erb
文件以获得更好的图片。您使用Turbo Frame时没有考虑到单页原则。
你现在只有一个名为“雇员”的框架。你所有的雇员卡片都是以普通的HTML格式添加的。基本上在div上添加dom_id是没有效果的,因为Turbo(无论是通过HTML响应还是Turbo_stream响应)不能删除任何不是Turbo框架的DOM元素。
当你从索引页中删除一张卡片时,我认为会发生的是索引页被重放,并发生flash。就像旧的Rails前Turbo时代一样。
在你的控制器里,你没有说你是否有一个
destroy.turbo_stream.erb
文件,但我怀疑这一点。如果你有,它无论如何都不会有任何影响。现在,关于你的显示视图,它是有趣的,因为代码似乎不匹配你的
_employee.html.erb
部分。那么你可能有一些自定义的HTML在show.html.erb
,以便使一个更详细的配置文件。但这个详细的配置文件可能没有一个涡轮帧。该怎么做
_employee.html.erb
文件中,用<%= turbo_frame_tag dom_id(employee) do %>
替换<div id="<%= dom_id employee %>">
,用<% end %>
替换结尾的</div>
。您的所有员工都将拥有自己的turbo帧。destroy.turbo_stream.erb
文件并在里面添加<%= turbo_stream.remove "employee_#{@employee.id}" %>
。这意味着不是重新加载你的索引页面,或者基本上导航你的应用程序与新的页面正在加载,右Turbo帧被删除从视图。你基本上没有离开你的视图。调用雇员#destroy已由Turbo异步完成。关于您的详细视图:
看起来这一切都是为了展示。最好创建另一个名为
_detailed_employee.html.erb
的部分,并添加相同的turbo帧<%= turbo_frame_tag dom_id(employee) %>
当您销毁它时,应该按照上面详述的相同方式将其从DOM中删除。
请注意,当您在放映中删除此卡片时,您的放映视图将为空。这可能不是您想要的。因此,您可能需要稍后调整您的逻辑。
此外,您的代码目前是混合的:你同时利用了Turbo框架(SPA概念)和经典导航。这一切都很好,你可能会在以后找到正确的平衡点。但是即使是有经验的程序员也不容易理解用HTTP方式实际访问一个页面并用Turbo做一些异步请求的概念。
我希望我的帖子没有太多的错误,它会帮助你。
PS:差点忘了:对于你的链接,你不需要重复employee两次
employee_path(employee, employee)
它使navbar中的路径看起来像employees/14.14
Rails理解ID参数是14,但是第二个14是不需要的。