43

保存模型后,我想重定向到模型索引视图。

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

知道出了什么问题吗?

4

4 回答 4

80
render action: "index"

不会重定向,重定向和渲染不同的,render 只会使用当前可用的变量渲染视图。而使用重定向,控制器的索引功能将运行,然后视图将从那里呈现。

您收到错误是因为您的索引视图期待一些您没有提供给它的数组,因为您只是呈现“索引”并且您没有视图需要的变量。

你可以通过两种方式做到这一点

1-使用render action: "index"

在渲染之前向视图提供它需要的所有变量,例如,它可能需要一个 @posts 变量,用于显示帖子列表,因此您需要在渲染之前在创建操作中获取帖子

@posts = Post.find(:all)

2-不要渲染做一个redirect_to

而不是呈现“索引”,而是重定向到索引操作,该操作将负责执行索引视图所需的必要操作

redirect_to action: "index"
于 2012-05-03T21:52:36.723 回答
7

视图“索引”包括“@tests.each do”-loop。并且方法 create 不提供变量“@tests”。所以你有错误。你可以试试这个:

format.html { redirect_to action: "index", notice: 'Test was successfully created.' }
于 2012-05-03T21:53:10.657 回答
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

它将重定向到索引页面

于 2013-02-08T06:21:51.800 回答
3

有两种方法可以做到这一点:

  1. 使用以下资源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.' }

于 2016-03-12T16:40:32.617 回答