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

Max*_*s S 0 post get ruby-on-rails

在LessonsController中,有newcreate方法.

def new
  @lesson = Lesson.new
end

def create
  @lesson = Lesson.new(params[:lesson])
  if @lesson.save do something end
end
Run Code Online (Sandbox Code Playgroud)

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

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

所以我的困惑是,为什么你@lessoncreate方法中再次创造对象?我认为这个问题的答案可能要涉及的一些概念GETPOSTHTTP方法为好.

我感谢任何帮助!谢谢.

Jas*_*ngh 5

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

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

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

@lesson = Lesson.new

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

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

这个^第二次你正在使用从表单提交的值(通常是POST请求#create)启动实例变量.我希望通过这种方式清除任何空气.

  • 另外,重要的是要注意`create`方法应该定义一个与`new`方法中的on相同名称的实例变量,因为通常你会在`create`方法中检查`@ lesson`是否有效.如果不是,则渲染`new.html.erb`模板(这就是为什么表单数据在验证失败后不会被删除的原因).在这种情况下,将使用`create`方法中定义的`@ lesson`而不是`new`方法中定义的`@ lesson`立即呈现新模板. (2认同)