Rails中删除后重定向至来源索引页及删除链接放置问题
解决方法:根据来源页面重定向的删除操作
嘿,这个场景我之前做项目的时候刚好遇到过,给你两个实用的解决方案,你可以根据自己的需求选:
方案一:直接利用请求来源(简单快捷)
Rails里的request.referer可以直接获取到用户跳转到当前页面的来源URL,我们可以在Books控制器的destroy方法里直接用它来做重定向:
# app/controllers/books_controller.rb def destroy @book = Book.find(params[:id]) @book.destroy # 如果来源存在就跳回去,否则默认跳转到books索引页 redirect_to request.referer || books_path, notice: "Book deleted successfully!" end
对应的show页面删除链接不用额外加参数,正常写就行:
# app/views/books/show.html.erb <%= link_to "Delete Book", @book, method: :delete, data: { confirm: "确定要删除这本书吗?" } %>
这个方案的好处是不用修改任何跳转链接,直接在控制器里处理就行,非常省心。不过要注意:有些浏览器或者隐私设置可能会屏蔽referer信息,这时候就会触发默认的books_path跳转。
方案二:手动传递来源标识(更可控)
如果想完全掌控跳转逻辑,避免referer失效的情况,可以在跳转的时候给show页面传递一个来源参数,然后根据这个参数决定重定向目标:
修改两个索引页的跳转链接,加上
source参数:# app/views/users/index.html.erb(用户索引页的书籍链接) <%= link_to book.title, book_path(book, source: "users") %># app/views/books/index.html.erb(书籍索引页的自身链接) <%= link_to book.title, book_path(book, source: "books") %>在show页面的删除链接里带上这个source参数:
# app/views/books/show.html.erb <%= link_to "Delete Book", book_path(@book, source: params[:source]), method: :delete, data: { confirm: "确定要删除这本书吗?" } %>在Books控制器的destroy方法里判断来源:
# app/controllers/books_controller.rb def destroy @book = Book.find(params[:id]) @book.destroy redirect_path = params[:source] == "users" ? users_path : books_path redirect_to redirect_path, notice: "Book deleted successfully!" end
这个方案的优势是逻辑更清晰,不会受浏览器设置影响,适合对跳转逻辑有严格要求的场景。
小提示
不管用哪个方案,都记得加上data: { confirm: ... }的确认提示,避免用户误触删除操作哦~
内容的提问来源于stack exchange,提问作者Aarthi
相关产品推荐
相关产品推荐

