2017-01-19 33 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記錄背後的原因之一。

我希望你明白我的觀點。也許其他人可以更好地解釋這背後的任何其他原因。

相關問題