Подтвердить что ты не робот

Перенаправлять на индекс, а не показывать после сохранения

Я хочу перенаправить на просмотр индекса моделей после сохранения моей модели.

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

Любая идея, что пойдет не так?

4b9b3361

Ответ 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.' }

  1. Использование действия контроллера:

format.html { redirect_to action: :index, notice: 'Todo item was successfully created.' }