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

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

4

2 回答 2

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外部操作。

如果您试图快速原型化/激发某些东西,您可能会通过使用实例变量来节省一些字符,但这不是干净的代码。

于 2013-04-07T20:54:29.183 回答
0

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

综上所述,它绝不需要做任何事情,它只是遵循 Rails 构建在其之上的 MVC 结构。不需要模式,总是有其他解决方案,只是执行此操作的公认方法涉及一个模型 - 尽管是空的。

最后,我不知道您何时或为什么要使用new路由响应,JSON因为new路由通常用于显示表单以创建对象,而create函数是用于实际创建模型的新实例的函数.

于 2013-04-07T20:49:14.387 回答