質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

336閲覧

自前のvalidateクラスの画面遷移設計

tkshp

総合スコア174

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/02/14 12:53

編集2019/02/14 17:33

前提・実現したいこと

データベースに保存しないで、indexアクションの入力内容を、confirmアクションにPOST送信する際、
バリデートチェックをかけて、入力に不備があればindexアクションに戻り、エラーメッセージを表示することを考えています。
その実装が一応できたのですが、
おそらく設計が変だと自覚している為、改善方法のご教示をお願い致します。

試したこと。

・バリデートクラス。

class SampleValidate include ActiveModel::Model attr_accessor :id, pass validates :id, presence: true validates :pass, presence: true end

・コントローラ。

ruby

1class SamplesController < ApplicationController 2 protect_from_forgery 3 def index 4 @svalidate = SampleValidate.new 5 end 6 7 def confirm 8 @svalidate = SampleValidate.new 9 @svalidate.id = params[:id] 10 @svalidate.pass = params[:pass] 11 if @svalidate.valid? 12 render 'confirm' 13 else 14 render 'index' 15 end 16 end 17end

indexのテンプレートファイルでは、@svalidateを埋め込んでエラーメッセージを表示させています。

この実装に関して、以下2点がおかしいような気がするのですが、改善可能でしたら、ご教示お願いします。

・1点目。 indexのテンプレートで@svalidateのエラーメッセージを埋め込む為に、 バリデートクラスを2回newしている点。 可能であれば、1回のnewで済む方法があれば教えていただきたいです。 アクション間で、共通のインスタンス変数を認識する方法ってないですか? もしくは簡単にアクション間でインスタンス変数を渡せないですか? ・2点目。 バリデートに引っ掛かっているとき、renderでindexを表示している点。 URLがconfirmのもので、indexが表示されます。 confirmはルーティングでPOSTからの受付しか許可していないので、 ブラウザをリロードすると、URLがconfirmのときのindexページはエラーを起こします。 リダイレクトでindexアクションを表示すればいいのかもしれませんが、その場合、@svalidateをリダイレクト先のindexアクションに引き継がせる方法がわかりません。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

結論としては、このままで問題ないと思います。

1点目

indexアクションとconfirmアクションは別々のアクセスです。
なので、confirmアクションが呼ばれるときはindexアクションで作ったものをRailsは覚えていません。
2回newしているのではなく、1回のアクセスごとに1回ずつnewしているので問題ありません。
httpがステートレスなプロトコルであることを意識すると腑に落ちるかもしれません。
参考 : https://qiita.com/mtakehara21/items/efcbbc3ba58a62c10eb6

2点目

たしかにこれは気になりますよねw
ですが、これはRails的には標準的な動作です。

試しにscaffoldで何か作ってみてください。
controllerを見れば分かりますが、newアクションでフォームを表示して、createアクションで失敗したらnewがレンダーされます。
このときのURLは、newではなくcreateのURLになっています。
scaffoldの場合はcreateのURLをgetでアクセスしたらindexになるのでエラーは起きませんが、挙動としては同じです。

もしどうしても気になるようであれば、confirmのURLをgetでアクセスしたときのアクションを別途作って、エラー画面を出す、とかになると思います。

投稿2019/02/15 01:00

Kta-M

総合スコア456

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

tkshp

2019/02/15 02:21

ご回答ありがとうございます。 ご教示いただいたおかげでとても腑に落ちました。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問