为什么在RoR模型控制器中创建模型实例两次?

时间:2016-02-11 13:44:25

标签: ruby-on-rails ruby-on-rails-4 model-view-controller controller

在rails中创建新模型时, 在控制器中代码

def new
    @model_name = Model_name.new
end

def create
    @model_name = Model_name.new(model_name_params)
    if @model_name.save
    etc.
    etc.
end

为什么在程序中将@model_name实例变量设置为两次?不是'新'中的@model_name变量。动作由'创建'中的@model_name变量覆盖动作?

我知道new操作呈现一个表单,该表单执行POST到/ model_name,调用model_name#create ...但我不知道为什么要调用它新行动。

2 个答案:

答案 0 :(得分:3)

因为在new操作中您只是使用空值初始化对象,因此您可以创建表单,例如form_for @user do |f|等..,您将填写此表单,单击提交,参数来自表格将被传递给创造行动..

create操作上,您再次初始化对象(您不再处于新操作状态,之前的对象已丢失,因此您再次创建它),但这次您将params的值分配给此对象。在此之后,您可以尝试保存此对象。

答案 1 :(得分:0)

  

为什么在程序中将@model_name实例变量设置为两次?

没有设置两次。该过程需要在两个单独的调用中加载newcreate。这些调用将调用Controller类的两个实例

如果您使用了控制器的单个实例,那么这两个变量将同时定义(如果您调用了两个实例方法)。但是,由于每个新request调用Controller的单个实例,因此不会发生这种情况:

enter image description here

Rails控制器的流程为:

Request > Rack > Routes > Controller.new(request).action > Response

因此,如果请求被路由到EventsController.new(request).new,则您拥有的唯一数据是@model_name = ModelName.new;同样适用于create

为了更好地理解它,您需要熟悉Object Orientated Programming (OOP)

OOP

您有两个变量的原因是因为您正在调用Controller实例。与所有object orientated programming一样,@instance变量可以访问class的整个实例中的数据。

如果您希望视图中的@instance_variable可用(类的扩展名),则需要将其范围限定为实例,而不是方法。

如果您有以下代码......

def new
  model_name = Model_name.new
end

... model_name只能直接在new方法中使用,而不是视图等。