ruby rail 7未发生重定向

jdzmm42g  于 2022-11-04  发布在  Ruby
关注(0)|答案(1)|浏览(193)

我遇到了一个问题,删除方法没有触发我的控制器中指定的重定向。我正在使用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

rqenqsqc

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是不需要的。

相关问题