Перенаправлять на индекс, а не показывать после сохранения
Я хочу перенаправить на просмотр индекса моделей после сохранения моей модели.
def create
@test = Test.new(params[:test])
respond_to do |format|
if @test.save
format.html { redirect_to @test, notice: 'test was successfully created.' }
else
format.html { render action: "new" }
end
end
end
Я пробовал
format.html { render action: "index", notice: 'Test was successfully created.' }
но я получаю следующую ошибку в /app/views/tests/index.html.erb -
undefined method `each' for nil:NilClass
Любая идея, что пойдет не так?
Ответы
Ответ 1
render action: "index"
не будет перенаправлять, перенаправлять и рендеринг другого, рендеринг просто отобразит представление с текущими доступными переменными. в то время как при перенаправлении будет выполняться функция индекса контроллера, после чего представление будет отображаться оттуда.
вы получаете сообщение об ошибке, потому что ваш индексный вид ожидает какого-либо массива, который вы не даете ему, поскольку вы просто показываете "индекс", и у вас нет переменных, которые необходимы для представления.
Вы можете сделать это двумя способами.
1- используя render action: "index"
предоставить доступ ко всем переменным, которые ему нужны перед рендерингом, например, может понадобиться переменная @posts, которую он использует для отображения списка сообщений, поэтому вам нужно получить сообщения в своем действии создания до того, как вы выполните рендеринг
@posts = Post.find(:all)
2- не выполнять do redirect_to
вместо рендеринга "index" вы перенаправляете на действие индекса, которое позаботится о том, чтобы делать необходимые вещи, которые нужны индексу.
redirect_to action: "index"
Ответ 2
В представлении "index" есть "@tests.each do" -loop. И метод create не предоставляет переменную "@tests". поэтому у вас есть ошибка.
Вы можете попробовать следующее:
format.html { redirect_to action: "index", notice: 'Test was successfully created.' }
Ответ 3
Это очень просто.
Просто перепишите свой метод, например
def create
@test = Test.new(params[:test])
respond_to do |format|
if @test.save
format.html { **redirect_to tests_path**, notice: 'test was successfully created.' }
else
format.html { render action: "new" }
end
end
end
Он перенаправляется на индексную страницу
Ответ 4
Есть два способа сделать это:
- Использование ресурса из
rake routes
:
format.html { redirect_to todo_items_url, notice: 'Todo item was successfully created.' }
- Использование действия контроллера:
format.html { redirect_to action: :index, notice: 'Todo item was successfully created.' }