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 :(得分: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
函数是用于实际创建模型的新实例的函数。