在Rails的新方法中创建实例的目的是什么?

时间:2017-01-19 06:09:26

标签: ruby-on-rails render

guide学习rails,但在new中有一个空文章实例的原因是什么?当你转到new时,它只是为你呈现一个表单,然后当你提交时,它会在create动作中使用新实例创建它。如果有错误,它会将该实例返回到新视图(窗体)是否正确?在文档中,它说如下:

  

我们之所以添加@article = Article.new   ArticlesController是其他@article在我们的将是零   查看,并调用@ article.errors.any?会引发错误。

但是,如果您已经通过@article操作创建了实例,为什么nilcreate?为什么新操作需要创建另一个有错误的实例?不是由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

2 个答案:

答案 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 %>具有适当的idname,以便稍后可以在create操作中进行映射。

模型中没有title属性,然后会抛出错误。所以你不能这样做:

<%= f.text_field :body %>

因为rails知道,此表单适用于Article,而您的文章没有body的任何属性(列)。

表格生成时,您对create行动一无所知。它只知道new行动。

因此,这是初始化表单new记录的原因之一。

我希望你明白我的观点。也许其他人可以用这背后的任何其他原因更好地解释。