在LessonsController中,有new
和create
方法。
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
对象?我认为这个问题的答案可能还需要涉及GET
和POST
HTTP方法的一些概念。
我感谢任何帮助!谢谢。
答案 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
的新实例并保存它。