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

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

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

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

Q&A

解決済

1回答

249閲覧

バリデーションエラーが発生した際、パーシャルでレイアウトを振り分ける方法

freeze

総合スコア21

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

1グッド

1クリップ

投稿2018/05/02 13:37

機能の概要説明

現在、疑似ツイッターアプリを作成しています。

http://〇〇/tweets/newページは、テキストボックスに文章を入力し、ツイートボタン押下で投稿します。
http://〇〇/tweetsページは、ユーザが投稿したツイート一覧が表示されます。

http://〇〇/tweets/newでツイートボタンを押下した後、http://〇〇/tweetsへ画面遷移し、投稿した文章が反映されます。

パーシャルのコード

http://〇〇/tweets/newhttp://〇〇/tweetsのヘッダーは、大部分が同じであるため、パーシャルを用いて共通化しようと試みました。
しかし、一部分のみ差異があるため、その部分はURLによって表示するか否かを振り分けることにしました。

具体的には、下記のように分けています。

html

1<!-- ファイル名は _header.html.erb --> 2<% if (request.path_info == tweets_path) %> 3 <!-- http://〇〇/tweets ページのみ表示するHTML --> 4<% end %>

バリデーションの仕様

http://〇〇/tweets/newページで、ユーザがテキストボックスに値を入力し、ツイートボタンを押下した際、
入力された内容が不適切(何も入力されていない/140文字より多い)だった場合、バリデーションエラーを発生させます。

Ruby

1class TweetsController < ApplicationController 2 def create 3 @tweets = Tweet.new(tweets_params) 4 if @tweets.save 5 redirect_to tweets_path 6 else 7 render 'new' 8 end 9 end 10end

問題点/質問

ここで、実際にバリデーションエラーが発生した場合、
URLはhttp://〇〇/tweetsで、表示される内容はhttp://〇〇/tweets/newとなります。

すると、パーシャルのURLによって振り分けている条件で、
「見かけ上はhttp://〇〇/tweets/newなのにhttp://〇〇/tweetsのヘッダーが表示される」
という状況に陥っており、こちらの対処で詰まってしまいました。


現状、私が考えている代替案として、
0. パーシャル内には、完全に共通化しているコードのみ記述するようにする
0. バリデーションエラーを発生させず、JavaScriptを使用して前段階で弾く

といったことを考えていますが、実際このように対処するしかないのでしょうか?

「バリデーションエラーが発生した場合であっても、一つのパーシャルでレイアウトを振り分ける方法」
ズバリこのような方法があれば、ご教示いただきたく存じます
(また、そもそも機能や仕様について改善点がある場合もご指摘ください)。

以上、よろしくお願いいたします。

kawakawa2018👍を押しています

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

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

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

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

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

guest

回答1

0

ベストアンサー

わたしだったら

  1. パーシャル内には、完全に共通化しているコードのみ記述するようにする

かな。

そもそもパーシャルは一つでなければならないなんて決まりもないし、部品毎に複数あっても構わないんだよ。パーシャルの中で、パスによって分岐なんてしちゃうと、実際のパーシャルがどうなるのかが、パーシャルを見ないとわかんなくなっちゃう。理想は、呼び出し側だけを見て、パーシャルは見なくても良くなるようにすることだよ。つまり、分岐するところは常に一カ所にまとまっている方が、この処理をするときは、どうなるのかってのが後からわかりやすくなると言うことかな。

どうしても、パーシャルで共通化したいというのであれば、パーシャルをローカルな変数付きで呼び出すことかな。パーシャルを外部の変数等に依存にさせるのではなく、どのようにするのかを呼び出し側の責任にさせるって事。下記の記事なんかを参考にしてみてね。

Rails 部分テンプレートの使い方 - Qiita

あとね、バリデーションをJavaScriptですることはユーザーフレンドリーで良い事なんだけど、Ruby側でバリデーションしなくてもいいと言うことにはならないわ。JavaScriptが切られているかも知れないし、そもそも不正なデータを送られてくると言うのもあるのよ。もし、Ruby側のチェックを外してしまったら、何も書いてない投稿や長文の投稿をされちゃうっていたずらをされる危険性があるわ。結局JavaScriptで対策してもRuby側のバリデーションはなくせないから、根本的な解決にならないと思うわ。

投稿2018/05/02 15:37

raccy

総合スコア21733

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

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

freeze

2018/05/03 03:57

回答ありがとうございます。 このように指摘されると、JavaScriptだけでエラーチェックをするのは邪道でしたね。。 パーシャルの書き方をもう一度見直してみようと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問