2012-02-15 4 views
2

私のスタックはRailsのですが、問題は、フレームワークの独立RESTで無効なPUT/POSTが原因でUXの混乱を処理する最も良い方法は?

RESTの方法論は、既存のユーザーの編集フォームを見るために

と言う実際にある:

GET: users/:id/edit 

既存のユーザーを更新するには:

PUT: users/:id 

これは、検証エラー

するための手段は何これは、フォームが検証に失敗した場合を除き、すべての賢明です。フォームは、URLを検証していない場合、あなたは上で終わるusers/:id/edit URLではありませんが、代わりに:

users/:id 

これには二つの問題が発生します。一つは、ナビゲーションで、他のユーザーがフォームをリフレッシュするとどうなるかです:

新鮮編集フォーム:

enter image description here

同じ形式エラーが発生した - URLとNAVは、私たちがしている示唆しているがどこか別の

enter image description here

視覚的にページが共同でnavとURLとしてnfusingすると、ユーザーは編集フォームにはなく、resource#showページに表示されます。

彼らは今のフォームを更新した場合、ユーザーが見ている何- 完全に別のページ

また、他の意味を持っています。ユーザーが不満を感じてフォームをリセットしたい場合、その本能はページを更新することになります。彼らがそれをするなら、彼らはresource#showページで見つかるでしょうが、resource#editページでは見つからないでしょう。

enter image description here

単純に我々は戻っresource#edit URLに無効な投稿をリダイレクトすることがあります。これを行うと、(デフォルトではRailsでは)メモリに格納されているので、単に送信した形式でエラーを表示することはできません。

可能な解決策として、これまで私はこれを解決するための二つの方法があります見ることができるように

userオブジェクトをシリアル化し、セッションに格納します。PUT users/:idが検証に失敗した場合

  1. が。GET users/:id/editにリダイレクトして、エラーを表示するには、次のページ上のオブジェクトをアンシリアライズ - 汚い感じている - PUTusers/:id/editではなくusers/:idに行くようにルーティング汚い
  2. 変更と感じています。

質問

この問題を解決するための最も適切な方法は何ですか?シリアライゼーションのアプローチがおそらく最も理にかなっているように感じますが、それはRailsのコアの一部ではないので、私は何かが欠けているように感じます。私はこれに取り組む最初の人ではなく、他の人のアプローチに興味があることを知っています。

+0

ここでも満足のいく回答はありませんが、http://stackoverflow.com/questions/5047136/the-correct-way-to-handle-invalid-form-submissions-in-rails/5054434#5054434 – robd

答えて

1

まずは、これは通常のレールアプリケーションの典型的な動作です。

誰かが無効なフォームを送信した場合、そのページをリフレッシュすると、何が起こるはずですか?あなたが見た場合や典型的なレールアプリでは、更新するだけで(レコードを更新する場合)、ユーザーエクスペリエンスからそれらをポップする可能性があります。 IMO、OKです。リフレッシュするとウェブが壊れることがあります:)

これは一般に、デザイナーが「無効な」ページのスタイルを変更したいとき、または開発者がエラーページのレンダリングのバグを見ているときに表示されます。ページを修正することを期待している可能性があるページをリフレッシュするが、代わりに、/ plumbersに関連したエラーが取得要求を受け付けない、またはそれらがplumbers#indexページに戻される可能性がある。

短い答えは通常、ほとんどのレールアプリで大したことではありません。この方法で行われているので、回答とエラーをセッションに一時的に保存して編集にリダイレクトする必要はありませんページ、それはすべて1つの要求と応答サイクルで完了します。あなたは

class PlumbersController 
    def update 
     plumber = Plumber.find(params[:id]) 
     if plumber.update(params[:plumber]) 
      redirect_to(plumbers_path, :message => "successfully updated!") 
     else 
     flash[:plumber_attributes] = params[:plumber] 
     redirect_to plumber_edit 
     end 
    end 
    def edit 
     @plumber = Plumber.find(params[:id]) 
     @plumber.assign_attributes(flash[:plumber]) if flash[:plumber.present?] 
    end 
    end 

NOTEようにあなたが何かを行うことができます動作を変更したい場合は

:このコードは、テストされていません。一般的な考え方は、配管工の属性をフラッシュにポップし、配管の編集URLにリダイレクトすることです。

これは、あなたが記述している動作が典型的で、レールが周りを回る唯一の方法は、アプリケーションロジックのセッション(フラッシュ)に依存することです。

+0

もご覧ください。私が来たのと同じ結論。それを文書化していただきありがとうございます。私はそれをupvotedしました。 –

関連する問題