我有一个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
当我第一次进入新动作时,这是有效的。但是,当我从失败的create
重定向到此处时,我会获得@ {{1}的nil
。
为什么会这样,我如何定义@movies以便它可以用于重定向的失败创作呢?
答案 0 :(得分:2)
如果create
操作失败,您通常不应使用redirect_to
将浏览器指向new
操作。相反,如果保存失败,您应该只是调用render :new
。
当您render
另一个操作视图时,您需要确保为该视图提供所需的变量(在您的情况下为@movies
和@movie
)。 <{1}}动作本身在调用new
时未执行。
解决此问题的一种方法是将render :new
分配移至@movies
。这样,它将在before_filter
和:new
操作之前分配,保证在您呈现:create
操作视图时它的可用性。
:new