Soo*_*e J 1 ruby-on-rails instance-variables
为什么控制器中的新动作需要初始化实例变量@article?我已经测试过,在新操作中没有实例变量的情况下,记录可以很好地保存到数据库中的表中。
class ArticlesController < ApplicationController
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render 'new'
end
end
end
Run Code Online (Sandbox Code Playgroud)
创建模型的空实例的目的是基于这样的想法:新视图与编辑视图共享大量视图代码,因此需要模型来工作。
例如,在许多情况下,新建页面和编辑页面几乎相同。文章的新页面可能允许用户输入姓名、作者和发布日期。现在,用户可能希望编辑此信息,您可能会向他们显示完全相同的三个文本字段,用于编辑名称、作者和发布日期。
为了使其干燥(不要重复),您可以将该表单合并到单个视图部分中。你最终会得到这样的视图:
# new.html.haml
New Article
= render :partial => "form"
# edit.html.haml
Edit Article
= render :partial => "form"
# _form.html.haml
= text_field_tag "title", @article.title
= text_field_tag "author", @article.author
= text_field_tag "publishing_date", @article.publishing_date
Run Code Online (Sandbox Code Playgroud)
显然,当您编辑现有文章时,您需要从数据库中获取该数据,然后使用其属性来填写表单。很多人所做的就是在新页面中重用该表单,但现在表单期望有一个@article
变量,因此程序员在他们的操作中初始化一个空变量new
。
如果您的表单部分需要调用对象上的方法,这也会有所帮助。例如:
# article.rb
def published_today?
return (self.publishing_date.to_date == Date.today)
end
# _form.html.haml
- if @article.published_today?
%strong New!
Run Code Online (Sandbox Code Playgroud)
但是,如果您的新页面和编辑页面不共享相同的代码,并且您的新页面不需要创建空的模型实例,那么不用担心,没关系。