2017-01-19 25 views
1

guide学习导轨,但在new中有空物品实例的原因是什么?当你去新的时候,它只是为你呈现一个表格,然后当你提交时,它会使用create行动中的新实例创建它。如果有错误,它将该实例返回到新视图(表单)是否正确?在文档,它说以下:在Rails的新方法中创建实例的目的是什么?

为什么我们在 ArticlesController添加@article = Article.new的原因是,否则@article是零我们 观点,并呼吁@ article.errors。任何?会抛出一个错误。

但是为什么@articlenil如果您已经通过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 

回答

2

滑轨仅运行内部处理请求时相应的动作的代码。所以当用户只去/articles/newnew动作被触发,当用户发出HTTP POST请求时/articles只有create动作被调用。阅读导航guides on ActionController

+0

因此,文章何时无法保存,新文件如何呈现,错误如何从新文件进入@article? – stackjlei

+0

如果'@ article.save'返回'false',那么'new.html.erb'模板会用已定义的'@ article'实例呈现。即'create'方法中的'render'new''不运行'new'方法。它只是使用它的html模板来呈现页面 –

+0

,那么当新的'@ article'用在新的?当你第一次访问该页面查看表单? “@文章”的目的是什么 – stackjlei

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 %> 

所以,当你做到这一点,轨知道您正在生成@article一种形式,是Article一个(空的)对象类。

所以它从产生之类 <%= f.text_field :title %>适当idname,以便它可以在create行动后映射相应的HTML从助手。

模型中没有title属性,则会引发错误。所以你不能这样做:

<%= f.text_field :body %> 

由于Rails知道,这种形式是Article和你的文章不具有任何body属性(列)。

当表单生成时,它对您的create操作没有任何意见。它只知道new行动。

所以这是初始化表格的new记录背后的原因之一。

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

相关问题