如果我在不同的子目录中有多个控制器,如何使用redirect_to?

时间:2009-03-28 16:36:08

标签: ruby-on-rails ruby

我已经创建了一个小型应用程序来学习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:如果您需要更多信息,请发表评论。

3 个答案:

答案 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以及需要路径的任何其他帮助程序。