0

我有一个 RESTful 应用程序,可以在其中创建电影摘要。

在我的新页面上,我希望能够看到我已经创建的电影的标题。

在我的控制器中,我在新操作中定义了@movies两者@movie

  def new
    @movies = Movie.all
    @movie = Movie.new
  end

在我的新视图中,我在表单上方包含了 @movies 的数据

<% @movies.each do |movie| %>
  <tr>
    <td><%= movie.name %></td>
    <td><%= movie.info %></td>
  </tr>
<% end %>
#My form starts here, under the table of movie info

这在我第一次进入新动作时有效。但是,当我从 failed 重定向到这里时create,我得到nil了@movies。

为什么会这样,我如何定义 @movies 以便它也适用于重定向失败的创作?

4

1 回答 1

2

如果create操作失败,您通常不应使用 aredirect_to将浏览器指向该new操作。render :new相反,如果保存失败,您应该简单地调用。

当您render查看另一个操作的视图时,您需要确保为该视图提供它期望的变量(在您的情况下是@moviesand @movie。当被调用时,new动作本身并没有被执行。render :new

解决此问题的一种方法是将@movies分配删除到before_filter. 这样,它将在:newand操作之前分配,确保在渲染操作视图:create时它的可用性。:new

class MoviesController < ApplicationController
  before_filter :prepare_movies, only: [ :new, :create ]

  def new
    @movie = Movie.new
  end

  def create
    @movie = Movie.new(params[:movie])

    if @movie.save
      # success; redirect elsewhere
    else
      # failure; render the :new action's view
      render :new
    end
  end

  private

    def prepare_movies
      @movies = Movie.all
    end
end
于 2013-06-07T20:59:55.933 回答