从guide学习rails,但在new
中有一个空文章实例的原因是什么?当你转到new时,它只是为你呈现一个表单,然后当你提交时,它会在create
动作中使用新实例创建它。如果有错误,它会将该实例返回到新视图(窗体)是否正确?在文档中,它说如下:
我们之所以添加@article = Article.new ArticlesController是其他@article在我们的将是零 查看,并调用@ article.errors.any?会引发错误。
但是,如果您已经通过@article
操作创建了实例,为什么nil
会create
?为什么新操作需要创建另一个有错误的实例?不是由create
创建的实例,其中包含将以新的方式呈现的错误吗?
//控制器
def new
@article = Article.new
end
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article
else
render 'new'
end
end
private
def article_params
params.require(:article).permit(:title, :text)
end
答案 0 :(得分:2)
Rails在处理请求时仅运行相应操作中的代码。因此,当用户转到/articles/new
时,仅触发new
操作,并且当用户向/articles
发出HTTP POST请求时,仅调用create
操作。阅读导轨guides on ActionController
答案 1 :(得分:2)
我不是解释专家,但我会尝试。 对我来说,Rails使用这种方式,因此我们必须编写更少的代码,rails将处理剩下的事情。
这是你做的: 让我们假设,您的文章模型有2个属性(列),即标题,文本。
控制器:
def new
@article = Article.new
end
在你看来:
<%= form_for @article do |f| %>
<p>
<%= f.label :title %><br>
<%= f.text_field :title %>
</p>
<p>
<%= f.label :text %><br>
<%= f.text_area :text %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
所以当你这样做时,rails知道你正在为@article
生成一个Article
类的(空)对象的表单。
所以它从from帮助器生成适当的HTML
<%= f.text_field :title %>
具有适当的id
和name
,以便稍后可以在create
操作中进行映射。
模型中没有title
属性,然后会抛出错误。所以你不能这样做:
<%= f.text_field :body %>
因为rails知道,此表单适用于Article
,而您的文章没有body
的任何属性(列)。
表格生成时,您对create
行动一无所知。它只知道new
行动。
因此,这是初始化表单new
记录的原因之一。
我希望你明白我的观点。也许其他人可以用这背后的任何其他原因更好地解释。