Ruby on Rails - redirect_to

9

我对redirect_to语句不太理解。我的模型是"Book"(具有布尔属性"read"),控制器是"books"。现在我创建了一个名为"Admins"的第二个控制器,其中包含两种方法:index和change。index视图只渲染所有书籍的列表,其中包含一个链接到change方法:

<% @Books.each do |d| %>
<%= d.title %><br>
<% if d.read==true %>
<%= link_to "mark unread", change_path(:id=>d.id)%>
<% else %>
<%= link_to "mark read", change_path(:id=>d.id)%>
<%end %>

现在的更改方法只更改了“read”属性:
@book=Book.find(params[:id])
if @book.read==true
@book.update_attributes(:read => false)
else
@book.update_attributes(:read => true)
end
redirect_to action: "index"

问题是:Rails试图将我重定向到show操作,使用:id作为参数...(可能是因为change_url是/admins/change?id=3)。但我只想被重定向回索引视图“/admins”。
有什么办法吗?似乎如果有一个id作为参数,Rails总是尝试重定向到视图操作。
非常感谢。
PS: routes.rb包含resources:admins和resources:books。

你怎么知道 rails 尝试使用 :id 作为参数将我重定向到 show 操作?你有收到任何错误吗?如果有,请分享相应的服务器日志。 - Kirti Thorat
3个回答

12

使用此功能

redirect_to :controller => 'admins', :action => 'index'

要么

redirect_to admins_url
以上两个链接将直接带您到“AdminsController”的“index”页面。除非您正在从“AdminsController”的“index”操作重定向到“show”操作,否则Rails不会将其路由到“show”操作。既然您没有分享“AdminsController”的“index”操作代码,我建议您检查一下那里。

7

这篇文章很棒。它非常清楚地解释了为什么需要renderredirect_to以及它们的区别。关于刷新和复制的示例非常有价值。感谢您的分享。 - Dmitry Dmitriev

2

我几天前也遇到了类似的问题。我建议在列出书籍和标记/取消标记复选框的表单中完成此操作。

<%= form_for @book,:url => book_index_path do |f| %>

当我设置一个网站,用户创建数据后立即重定向到同一页(包括成功/错误消息),这对我非常有效。可以进行一种人工批处理。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接