Rails关于new和create方法的一点混乱

时间:2013-01-27 01:21:08

标签: ruby-on-rails post get

在LessonsController中,有newcreate方法。

def new
  @lesson = Lesson.new
end

def create
  @lesson = Lesson.new(params[:lesson])
  if @lesson.save do something end
end

我一直在我的应用程序中这样做而没有想到。它有效,但我很困惑为什么我在new和create动作中创建实例变量。据我所知,这就是流程:

当用户点击new lesson按钮时,系统会将其定向到LessonsController#new。当他输入所需的值并点击submit时,他将被定向到LessonsController#create。我不需要create方法的视图模板。

所以我的困惑是,你为什么要在@lesson方法中再次创建create对象?我认为这个问题的答案可能还需要涉及GETPOST HTTP方法的一些概念。

我感谢任何帮助!谢谢。

2 个答案:

答案 0 :(得分:5)

这是因为HTTP是无会话协议,并且任何实例变量都不会在多个请求之间转移。

加载#new页面的请求是一个请求,一旦您提交表单并点击create按钮(或任何其他对应按钮),浏览器就会向您的{发起新请求{1}}方法。

第一次使用#create方法 - 您正在使用默认值创建实例变量#new

@lesson

然而,第二次在@lesson = Lesson.new方法中 - 新请求强制创建一个非常不同的实例变量:

#create

这个^第二次你正在使用从表单提交的值(通常是@lessong = Lesson.new(params[:lesson])请求POST)启动实例变量。我希望通过这种方式清除任何空气。

答案 1 :(得分:2)

new操作用于呈现Lesson创建表单。您正在该操作中创建实例以构造表单。 rails表单助手使用Lesson操作中创建的空new来构造表单字段名称,提交URL等。除此之外,表单还可以访问DB迁移脚本中声明的默认值或者在模型的after_initialize回调中。 Lesson操作中创建的new实例未保存

当用户提交表单时,会调用create操作。在此操作中,您应该实例化Lesson的新实例并保存它。