2017-05-25 8 views
0

フォームの送信とルーティングを処理する最適な方法を判断しようとしています。Rails 5ルーティングとフォームの提出

Iは標準_form.html.erbを有し、ならびにnew.html.erbedit.html.erb - それぞれがneweditコントローラで宣言されformsubscription = @subscriptionをレンダリングアクション。

モデルはsubscriptionであり、これは_form.html.erb(それはcheckout名前空間にあります)で、私のform要素である -

<%= form_for([:checkout, subscription]) do |f| %> 

/checkout/subscriptions/newは、新しいサブスクリプションのURLです。フォームを送信すると、/subscriptionsに送信されます。

/subscriptions/indexの表示がないため、エラーが発生してブラウザをリフレッシュすると(ユーザーが何らかの理由でこれを行うことがわかっている)、エラーメッセージが表示されるという問題があります1)。

同じものが編集に適用されます。 /checkout/subscriptions/14/edit(例として)に行くと、すべてが素晴らしいです。しかし、フォームを提出すると、/subscriptionsに投稿されます。新しいものと同じ問題が発生します。ページを更新すると、の表示はありませんエラー。これは、Railsが新しい足場でそれを処理する方法です。

だから私の質問は以下のとおりです。

  • 私はform_forタグに使用する必要のあるURLは何ですか?
  • ルーティングのために何をすべきですか?
  • ページを更新するときにこのエラーを回避するにはどうすればよいですか?

答えて

3

これは、RESTのレールバージョンがどのように動作する(動作するはずの)方法です。ここでの鍵はHTTPメソッドです。

ページをリロードすると、GETリクエストが作成されます。コントローラはPOSTでリソースを作成し、PATCH/PUTで更新する必要があります。

GET requests should be idempotent(リソースの作成、変更または削除を行わないため)/subscriptionsまたは/subscriptions/:idのGETリクエストは非常に異なります。

あなたは何を行うことができます。

  • は、彼らがデータを失うことになるユーザーに警告するためにJavaScriptでwindow.beforeunloadイベントを使用してください。
  • GET /subscriptionsのパスをsubscriptions#newにルーティングします。
  • GET /subscriptions/:idのパスをsubscriptions#editにルーティングします。
+0

それは@maxでした - ありがとうございます。私は、同じコントローラアクションに対して複数のルートを持つことは決してありませんでした。 – Steve

+0

それは良い説明です。あなたに感謝します。乾杯! – Aashish

関連する問題