Ruby on rails 如果我';我们在不同的子目录中有多个控制器?
我创建了一个小应用程序来学习RoR。(图书数据库)它由只读区和读写管理区组成 在我首先使用了管理功能之后,我将控制器移动到一个子目录中,并创建了只读控制器 现在,当我在管理区更新一本书时,Ruby on rails 如果我';我们在不同的子目录中有多个控制器?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我创建了一个小应用程序来学习RoR。(图书数据库)它由只读区和读写管理区组成 在我首先使用了管理功能之后,我将控制器移动到一个子目录中,并创建了只读控制器 现在,当我在管理区更新一本书时,redirect\u to函数会重定向到只读区 我错过了什么 以下是我使用的代码: class Admin::BooksController < ApplicationController <snip> def update @book = Book.find params[:
redirect\u 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
class Admin::BooksController
此更新本身可以工作,但它将我重定向到/books/1
,但我希望它重定向到/admin/books/1
。我可以硬编码正确的路径,但我想这不是很好的风格
正确的方法是什么
PS:如果您需要更多信息,请发表评论。您告诉它重定向到book,因为您使用的是rails内置的魔法识别,它应该对@book对象执行什么操作(这是使用book controller构建一个url来显示书籍)
format.html { redirect_to @book }
如果你想让它去其他地方,你需要使用一个哈希表来明确你想让它去哪里
或者使用klew指出的路径
所以要了解更多细节-
重定向到(@book)
或
redirect_to book_path(@book)
这两个快捷方式都是:
redirect\u to:controller=>book,:action=>show',:id=>@book.id
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
等等
另一种方法是使用它自动为您创建控制器,并在需要时提供一些修改方法。它还为您提供一些有用的url帮助
collection_path # admin/books
object_path # admin/books/2
当您在视图中使用上述帮助程序时,如果您在其中,则会生成带有名称空间的url,否则将生成不带名称空间的url
resource\u controller并不完美,但在大多数情况下,它工作良好,节省了大量工作。您还可以传递一个数组以重定向,其中第一个元素是表示名称空间的符号,第二个元素是表示对象的元素
redirect_to [:admin_book, @book]
您也可以将其用于表单、链接和任何其他需要路径的帮助程序。您说的是“使用书本控制器”。但为什么选择“其他”书本控制器?我可以控制首选哪个控制器吗?可能会重定向到@book looks on object@book(而不是您所在的控制器上)并尝试查找默认控制器-这就是为什么您被重定向到管理命名空间之外。当您说重定向到@book rails时,内部代码将其转换为book控制器和单个book对象的默认操作(show)。这是一个很好的语法快捷方式,但不幸的是,它也对新手隐藏了正在发生的事情。我对它进行了测试,并更改了代码,因此它实际上可以工作,并删除了“我认为”。
redirect_to [:admin_book, @book]