我已经创建了一个小型应用程序来学习RoR。 (图书数据库)它由只读区域和读写管理区域组成。
在我首先运行管理功能之后,我已将控制器移动到子目录中并创建了只读控制器。
现在,当我在管理区域更新图书时,redirect_to
功能会重定向到只读区域。
我错过了什么?
这是我正在使用的代码:
class Admin::BooksController < ApplicationController
<snip>
def update
@book = Book.find params[:id]
respond_to do |format|
if @book.update_attributes params[:book]
flash[:notice] = "Book updated"
format.html { redirect_to @book }
format.xml { head :ok }
else
<snip>
end
end
end
<snip>
end
此更新本身有效,但会将我重定向到/books/1
,但我希望将其重定向到/admin/books/1
。我可以硬编码正确的路径,但我想这不是很好的风格。
什么是正确的方法?
PS:如果您需要更多信息,请发表评论。
答案 0 :(得分:6)
你告诉它重定向到书,因为你正在使用rails'内置神奇的识别它应该对@book对象做什么(这是建立一个使用书籍控制器显示书籍的URL。
format.html { redirect_to @book }
如果您希望它转到其他地方,您需要明确说明您希望它使用url_for
的散列
format.html { redirect_to :controller => 'admin/book', :action => 'show', :id => @book }
或使用像klew指出的路径。
所以更多细节 -
redirect_to (@book)
或
redirect_to book_path(@book)
都是这个的捷径:
redirect_to :controller => book, :action => 'show', :id => @book.id
答案 1 :(得分:3)
Rails根据您的routes.rb为您创建url助手。如果你有命名空间,那么你可以使用它:
admin_book_path(@book) # admin/books/2
admin_books_path # admin/books
edit_admin_book_path(@book) # admin/books/2/edit
等等。
另一种方法是使用它为控制器自动创建的resource_controller,并提供一些方法来修改它,如果需要的话。它还为您提供了一些有用的网址助手
collection_path # admin/books
object_path # admin/books/2
当您在视图中使用上面的帮助程序时,如果您在一个文件夹中,或者在没有命名空间的情况下生成带有命名空间的URL,则会生成url。
resource_controller并不完美,但在大多数情况下它运行良好并节省了大量工作。
答案 2 :(得分:2)
您还可以传递数组以重定向,其中第一个元素是表示命名空间的符号,第二个元素是对象元素。
redirect_to [:admin_book, @book]
您也可以将此用于form_for,link_to以及需要路径的任何其他帮助程序。