在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
...但我不知道为什么要调用它新行动。
答案 0 :(得分:3)
因为在new
操作中您只是使用空值初始化对象,因此您可以创建表单,例如form_for @user do |f|
等..,您将填写此表单,单击提交,参数来自表格将被传递给创造行动..
在create
操作上,您再次初始化对象(您不再处于新操作状态,之前的对象已丢失,因此您再次创建它),但这次您将params的值分配给此对象。在此之后,您可以尝试保存此对象。
答案 1 :(得分:0)
为什么在程序中将
@model_name
实例变量设置为两次?
没有设置两次。该过程需要在两个单独的调用中加载new
和create
。这些调用将调用Controller
类的两个实例。
如果您使用了控制器的单个实例,那么这两个变量将同时定义(如果您调用了两个实例方法)。但是,由于每个新request
调用Controller
的单个实例,因此不会发生这种情况:
Rails控制器的流程为:
Request > Rack > Routes > Controller.new(request).action > Response
因此,如果请求被路由到EventsController.new(request).new
,则您拥有的唯一数据是@model_name = ModelName.new
;同样适用于create
。
为了更好地理解它,您需要熟悉Object Orientated Programming (OOP
):
您有两个变量的原因是因为您正在调用Controller
的实例。与所有object orientated programming一样,@instance
变量可以访问class
的整个实例中的数据。
如果您希望视图中的@instance_variable
可用(类的扩展名),则需要将其范围限定为实例,而不是方法。
如果您有以下代码......
def new
model_name = Model_name.new
end
... model_name
只能直接在new
方法中使用,而不是视图等。