0

在 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?我认为这个问题的答案可能还必须涉及一些关于HTTP 方法的GET概念。POST

我很感激任何帮助!谢谢你。

4

2 回答 2

5

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

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

第一次在#new方法中 - 您正在@lesson使用它的默认值创建一个实例变量:

@lesson = Lesson.new

但是,第二次在#create方法中 - 新请求强制创建一个非常不同的实例变量:

@lessong = Lesson.new(params[:lesson])

这 ^ 第二次您使用从表单提交中收到的值(通常是带有 的POST请求#create)来启动实例变量。我希望这能澄清为什么会这样。

于 2013-01-27T01:27:03.537 回答
2

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

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

于 2013-01-27T01:27:37.833 回答