Как мне использовать redirect_to, если у меня есть несколько контроллеров в разных подкаталогах? - PullRequest
4 голосов
/ 28 марта 2009

Я создал небольшое приложение для изучения 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 ]

6 голосов
/ 28 марта 2009

Вы говорите, чтобы он перенаправлял в книгу, потому что вы используете встроенное магическое рельсовое распознавание того, что он должен делать с объектом @book (который является URL-адресом для отображения книги с помощью контроллера книги.

format.html { redirect_to @book }

Если вы хотите, чтобы это пошло в другом месте, вам нужно четко указать, куда вы хотите, чтобы оно использовало хеш для url_for

format.html { redirect_to :controller => 'admin/book', :action => 'show', :id => @book   }

или используйте пути, как указывает Клеу.

так для более подробной информации -

redirect_to (@book) или

redirect_to  book_path(@book)

оба являются ярлыками для этого:

redirect_to :controller => book, :action => 'show', :id => @book.id

3 голосов
/ 28 марта 2009

Rails создает для вас помощников по URL на основе ваших маршрутов. Если у вас есть пространство имен, вы можете использовать это:

admin_book_path(@book)        # admin/books/2
admin_books_path              # admin/books
edit_admin_book_path(@book)   # admin/books/2/edit

и т. Д.

Другой способ - использовать resource_controller , он автоматически создает для вас контроллер и предоставляет несколько способов изменить его при необходимости. Он также дает вам несколько полезных помощников по URL

collection_path               # admin/books
object_path                   # admin/books/2

Когда вы используете вышеупомянутые помощники в представлениях, тогда он генерирует URL с пространством имен, если вы в нем, или без пространства имен в противном случае.

resource_controller не идеален, но в большинстве случаев он работает хорошо и экономит много работы.

2 голосов
/ 28 марта 2009

Вы также можете передать массив для перенаправления, где первый элемент является символом, представляющим пространство имен, а второй элемент - объектом.

redirect_to [:admin_book, @book]

Вы также можете использовать это для form_for, link_to и любых других помощников, которым требуется путь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...