質問: Tweet.new(tweets_params) if @tweets.save redirect_to tweets_path else render 'new' end end end ``` ### 問題点/質問 ここで、実際にバリデーションエラーが発生した場合、 **URLは`http://〇〇/tweets`で、表示される内容は`http://〇〇/tweets/new`となります。** すると、パーシャルのURLによって振り分けている条件で、 **「見かけ上は`http://〇〇/tweets/new`なのに`http://〇〇/tweets`のヘッダーが表示される」** という状況に陥っており、こちらの対処で詰まってしまいました。 --- 現状、私が考えている代替案として、 1. パーシャル内には、完全に共通化しているコードのみ記述するようにする 2. バリデーションエラーを発生させず、JavaScriptを使用して前段階で弾く といったことを考えていますが、実際このように対処するしかないのでしょうか? **「バリデーションエラーが発生した場合であっても、一つのパーシャルでレイアウトを振り分ける方法」** ズバリこのような方法があれば、ご教示いただきたく存じます (また、そもそも機能や仕様について改善点がある場合もご指摘ください)。 以上、よろしくお願いいたします。
回答: わたしだったら > > 1. パーシャル内には、完全に共通化しているコードのみ記述するようにする > > > かな。 そもそもパーシャルは一つでなければならないなんて決まりもないし、部品毎に複数あっても構わないんだよ。パーシャルの中で、パスによって分岐なんてしちゃうと、実際のパーシャルがどうなるのかが、パーシャルを見ないとわかんなくなっちゃう。理想は、呼び出し側だけを見て、パーシャルは見なくても良くなるようにすることだよ。つまり、分岐するところは常に一カ所にまとまっている方が、この処理をするときは、どうなるのかってのが後からわかりやすくなると言うことかな。 どうしても、パーシャルで共通化したいというのであれば、パーシャルをローカルな変数付きで呼び出すことかな。パーシャルを外部の変数等に依存にさせるのではなく、どのようにするのかを呼び出し側の責任にさせるって事。下記の記事なんかを参考にしてみてね。 Rails 部分テンプレートの使い方 - Qiita あとね、バリデーションをJavaScriptですることはユーザーフレンドリーで良い事なんだけど、Ruby側でバリデーションしなくてもいいと言うことにはならないわ。JavaScriptが切られているかも知れないし、そもそも不正なデータを送られてくると言うのもあるのよ。もし、Ruby側のチェックを外してしまったら、何も書いてない投稿や長文の投稿をされちゃうっていたずらをされる危険性があるわ。結局JavaScriptで対策してもRuby側のバリデーションはなくせないから、根本的な解決にならないと思うわ。