2013-04-07 80 views
1
def new 
    @post = Post.new 

    respond_to do |format| 
    format.html # new.html.erb 
    format.json { render json: @post } 
    end 
end 

def create 
    @post = Post.new(params[:post]) 
    #something else 
end 

在这里,因为当我们实际创建一个新帖子时,我们调用方法create使用Page.new(params [:page]),方法new只能用于调用视图new.html.erb。那么为什么我们仍然需要在这里的新方法中使用实例变量@post?为什么我们需要新的实例变量?

+0

使用'form_for'产生依赖于对象的形式,因此对于新的行动,它只是造成了空白表格空对象,但你可以重复使用形式的编辑操作和加载现有的Post对象,它会再加载相关领域到表单 – xkickflip 2013-04-07 20:39:21

+0

由于我们已经依赖于形式的对象,为什么我们需要在再次使用Page.new创建方法? – ZeroNegOne 2013-04-07 20:43:48

+3

“创建”操作的处理程序与调用“new”操作的处理程序完全不同。每个HTTP请求都会触发一个全新的Rails调用,它与其他每个HTTP请求都是隔离的。你设置的实例变量最初不再存在 - 你只是有一个新的请求对象,你必须再次处理参数 – Gareth 2013-04-07 20:48:35

回答

2

你不需要任何new实例变量或任何其他操作,但默认情况下,Rails的的脚手架使用它们。使用实例变量会带来一些小的好处,并且会有一些约定,但坦率地说它是粗糙的代码,不应该是默认值。在适当的MVC框架中,控制器的实例变量甚至不会被视图对象看到。

我宁愿是明确的,使用局部变量,并将它们传递给视图当地人:

def new 
    post = Post.new 
    respond_to do |format| 
    format.html { render locals: { post: post } } 
    format.json { render json: post } 
    end 
end 

这是更加明确,并使得你的意图明确。该视图对于局部变得更加灵活,因为您不必担心在从另一个视图内部渲染局部变量之前设置实例变量。它正确地封装了数据,并且不会在行动之外暴露您的post

如果你想快速原型/秒杀的东西,你可能会节省使用实例变量几个字符,但它不是干净的代码。

0

如果你没有创建一个新的实例变量,那么你不会有一个模型持有该模型应该是管理数据 - 别说你会为你的形式加入了很多更锅炉板而不是使用采用模型的表单助手。如果不使用模型,您完全没有按照预期使用MVC框架。

现在,一切都这样说,它绝不做任何事情,它只是下面的Rails所是建立在顶部的MVC结构所需要的手段。不需要任何模式,总是有其他解决方案,只是执行此操作的可接受方法涉及模型 - 尽管是空的模型。

最后,我不知道什么时候或为什么你要因为new路由通常用于显示窗体来创建一个对象与JSON一个new路线回应,而create功能是用来将一个实际上创建了一个新的模型实例。