2016-05-18 9 views
0

を知っているん:どのようにレールのルートは、私はRuby on Railsを学ぶために<a href="http://guides.rubyonrails.org/getting_started.html#adding-links" rel="nofollow">this tutorial</a>を以下だし、彼らはコントローラに以下のなかったモデルエラーに

def new 
    @article = Article.new 
end 

def create 
    @article = Article.new(article_params) 

    if @article.save 
    redirect_to @article 
    else 
    render 'new' #<-- 
    end 
end 

あなたは私が矢を持ってラインを見れば、ロジックがあります新しい記事を保存する際にエラーが発生した場合、render 'new'newルートに当てはまるでしょうか?)を再度実行してフォームをレンダリングして、エラーを修正して再送信してください。

私の質問は、新しいルートはどのようにエラーがあったのか分かりますか? @article.saveが失敗したときにエラーを送信する背景に何か起こっていますか?

新しいルートが新しい記事オブジェクトを作成してビューに送信するので、私は混乱します。エラーはどのように保存されていますか? が新しいルートに当たった、新しい記事を保存中にエラーが、私は「新しい」描画する必要がある場合...

<h1> 
    file thing add 
</h1> 
<%= link_to 'Back', articles_path %> 

<%= form_for :article, url: articles_path do |f| %> 

    <% if @article.errors.any? %> 
    <div id="error_explanation"> 
     <h2> 
     <%= pluralize(@article.errors.count, "error") %> prohibited 
     this article from being saved: 
     </h2> 
     <ul> 
     <% @article.errors.full_messages.each do |msg| %> 
      <li><%= msg %></li> 
     <% end %> 
     </ul> 
    </div> 
    <% end %> 

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

答えて

3

ActiveRecordのsaveメソッドが呼び出されると、データストアでの保存が試行されます。保存が成功すると、更新されたモデル/オブジェクト自体(真実)が返されます。保存に失敗するとfalseが返され、errorsプロパティがオブジェクトに追加されます。

基本的に、あなたの@articleインスタンス変数が持続するかの場合には

if the article saves successfully 
    redirect to the article's SHOW action (in rails router talk) 
else 
    redirect to the article NEW action 

を言っているが、1の場合にはそれがバックで動作するように便利なerrors配列とのステップをあなたに送っています。

+0

待って、ウズベキョンは記事にリダイレクトしないと言っています(これは 'render'ではないので 'redirect_to')...正しいシナリオですか? –

+1

申し訳ありませんが、上記のレンダリング/リダイレクトが混在している可能性があります。一般的にGETリクエスト以外は何もレンダリングしないでください。CREATEING、PUTING、PATCHING、DELETEINGの場合は、適切なGETリソース – erikdstock

+0

にリダイレクトする必要があります。コントローラ全体がインスタンス化されていることを覚えておくことも重要ですあなたの要求に対して、その内部オブジェクト(インスタンス変数)を動作させることができます.- 'redirect_to'は、いくつかの追加の魔法の魔法を投げたメソッドです。 – erikdstock

2

、および:ここ

は「新しい」ビューです私はエラーを修正した後に再提出できるようにフォームを再度レンダリングします。

...新しいルートが新しい記事オブジェクトを作成してビューに送信するので、私は混乱します。エラーはどのように保存されますか?

ここで間違った前提があります。 render 'new'は、ユーザーをyour_controller/new URIにリダイレクトしません。単にnew.html.erbをレンダリングします。そのため、newページにコントローラの現在のインスタンス変数があるのはこのためです。

+0

ああ、ありがたいことに、 –

関連する問題