0

RailsTutorialガイドに従おうとしていますが、代わりに独自のアプリケーションを実行しています。セクション 7 のフォームに問題があります。

私のコントローラー:

  def update
    d = Deck.find(params[:id])
    d.title = params[:deck][:title]
    d.slug = params[:deck][:slug]
    d.category = params[:deck][:category]

    if d.save
      redirect_to deck_path(d), notice: "Deck saved successfully"
    else
      render :edit
    end

  end

良いコードとはとてもかけ離れていることは承知していますが、後でリファクタリングします (提案があれば、私は完全に耳を傾けますが、Rails 3 を使用しているので、Rails 4 の強力なパラメーターは出ていると思います)。

問題は、d.save(検証のために) が機能しない場合render :editです。

現在、無効なデータを入力すると、showアクションにリダイレクトしようとし、表示するデータがないためにクラッシュします。の上
に追加すると機能しますが、URLは引き続きアクションです。@deck = drendershow

検証に失敗した場合、同じ URL にとどまり、エラー メッセージを表示するにはどうすればよいですか? 「URL を変更して同じページを表示する」という動作は有効と見なされますか?

ありがとう !

残りのコードに興味がある場合は、ここにあります: https://github.com/cosmo0/TeachMTG/tree/remodel-decks

4

3 に答える 3

3

実際に失敗した場合、URL は「表示」ではなく「更新」URL です。

あなたのコードは機能します。

フォームを送信すると、ブラウザは POST リクエストを controller#update に送信します。

更新が失敗した場合は、更新アクションに "render :edit" を指示します。:update ルート内で :edit アクションをレンダリングします。

update ルートは、show アクションと同じ URL を使用します。これは、「rake routes」を実行するときに確認できます。唯一の違いは、メソッドが「update」の POST と「show」の GET であることです。

そのため、ブラウザーの表示 URL だと思いますが、実際にはすべて機能します。:edit をレンダリングする更新アクションを実行しています。

(更新アクションに 'render :edit' を指示しても、:update から :edit にリダイレクトされるわけではありません)

それは十分に明確ですか?

于 2013-08-24T11:32:13.567 に答える
1

Respond_withメソッドを探していると思います。

于 2013-08-24T11:27:04.733 に答える
1

安らかな世界で何が起こっているのか、あなたは誤解していると思います。更新を行うと、フォームが実行されているため、URL が変更されますHTTP POST

d.save が機能する場合、オブジェクトとして d を使用して、deck_path にリダイレクトされます。失敗した場合、ブラウザーの URL は変更されませんが、アクションと同じページがレンダリングされますedit

アクションの呼び出しで、次のeditようなものがあると思います。

@deck =  Deck.find(id)

@deck更新で変数が割り当てられていないため、レンダリングが失敗しています。したがって、すべてのインスタンスをに変更するかd@deck設定のソリューションを使用できます@deck = d

于 2013-08-24T11:35:11.070 に答える