保存后重定向到索引而不是显示

时间:2012-05-03 21:42:56

标签: ruby-on-rails ruby-on-rails-3

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

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 个答案:

答案 0 :(得分:69)

render action: "index"

不会重定向,重定向和渲染不同的渲染,只会使用当前可用的变量渲染视图。使用重定向时,控制器的索引函数将运行,然后视图将从那里生成。

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

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

1-使用render action: "index"

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

@posts = Post.find(:all)

2-不要渲染redirect_to

而不是渲染“index”,而是重定向到索引操作,该操作将负责执行索引视图所需的必要事项

redirect_to action: "index"

答案 1 :(得分:7)

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

format.html { redirect_to action: "index", notice: 'Test was successfully created.' }

答案 2 :(得分: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

它将重定向到索引页

答案 3 :(得分:3)

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

  1. 使用rake routes
  2. 中的资源

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

    1. 使用控制器操作:
    2. format.html { redirect_to action: :index, notice: 'Todo item was successfully created.' }