Ruby on rails 如果我';我们在不同的子目录中有多个控制器?

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[:

我创建了一个小应用程序来学习RoR。(图书数据库)它由只读区和读写管理区组成

在我首先使用了管理功能之后,我将控制器移动到一个子目录中,并创建了只读控制器

现在,当我在管理区更新一本书时,
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]