为什么我们需要新的实例变量?

时间:2013-04-07 20:35:14

标签: ruby-on-rails

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?

2 个答案:

答案 0 :(得分:2)

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

我更喜欢明确,使用局部变量,并将它们作为本地传递给视图:

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

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

如果您正在尝试快速原型化/尖峰化,可以使用实例变量来保存一些字符,但这不是干净的代码。

答案 1 :(得分:0)

如果你没有创建一个新的实例变量,那么你就没有一个模型来保存模型应该管理的数据 - 更不用说你会为你的表单添加更多的样板使用模型的表单助手。如果不使用该模型,则不会完全按预期使用MVC框架。

现在所有人都说,它绝不需要做任何事情,它只是遵循Rails建立在其上的MVC结构。不需要任何模式,总有其他解决方案,只是所接受的执行此操作的方法涉及模型 - 尽管是空的。

最后,我不知道您何时或为何要使用new路由回复JSON,因为new路由通常用于显示要创建的表单create函数是用于实际创建模型的新实例的函数。