🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

Q&A

解決済

1回答

1195閲覧

rails バリデーション機能を追加したい。

ryousukesatou

総合スコア19

Model

MVCモデルの一部であるModelはアプリケーションで扱うデータとその動作を管理するために扱います。

Ruby on Rails

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

バリデーション

Validationとは特定の入力データが、求められた条件に当てまっているかをチェックするために使われます。

0グッド

0クリップ

投稿2019/09/15 08:25

編集2019/09/16 01:27

前提・実現したいこと

railsでバリデーションを設定したいのですが、全然できません。
2つのカラムを空欄の場合にデフォルトのエラーメッセージを表示する機能をつけたいのですが、
よくわかりません。

発生している問題・エラーメッセージ

ActionController::UrlGenerationError in BookersController#create No route matches {:action=>"show", :controller=>"bookers", :id=>nil}, missing required keys: [:id] Extracted source (around line #21): 19 20 21 22 23 24 booker = Booker.new(booker_params) booker.save redirect_to booker_path(booker) redirect_to bookers_path end 更新 NoMethodError in Bookers#create Showing /vagrant/Bookers/app/views/bookers/index.html.erb where line #11 raised: undefined method `each' for nil:NilClass Extracted source (around line #11): 9 10 11 12 13 14 </thead> <tbody> <% @bookers.each do |booker| %> <tr> <td><%= booker.title %></td> <td><%= booker.body %></td>

該当のソースコード

モデルのファイル class Booker < ApplicationRecord validates :title, presence: true validates :body, presence: true end コントローラーのファイル def create booker = Booker.new(booker_params) if booker.save flash[:notice] = "Successfully create!" redirect_to booker_path(booker) else render :index end end 更新 コントローラーのファイル def index @bookers = Booker.all @booker = Booker.new end def create booker = Booker.new(booker_params) if booker.save flash[:notice] = "Successfully create!" redirect_to booker_path(booker) else booker_path end end ・モデルのファイルに変更はありません。

試したこと

試すことがよくわからないです。すいません。
でも他のサイトではActiveRecord::Baseを継承しているクラスでしたので、
僕も変えてみたのですが、できませんでした。サイトによってはApplecationRecordを継承してても良さそうでしたが、正直よくわかりません。バリデーション機能を実装していないと、空でも
普通に投稿はできます。

補足情報(FW/ツールのバージョンなど)

ここにより詳細な情報を記載してください。
以前に一度モデルを作ったのですが、名前をミスしてrails d model モデル名
としてモデルを消してmodelsフォルダの以前にあったファイルを消したら 赤い丸がつきました。
ちなみに、sublime textを使っていて、もしかしたらこれが原因なのかと思いました。

更新内容
・2つのカラムに内容を記述するときのみ保存できてて、どちらかが空欄の時、もしくは両方空欄の時にエラーができるので、バリデーションはできてるのかなと思いました。しかし、保存失敗した時にエラーが発生する状況です。
・そのエラー内容と関係のありそうなコードを「更新」と書いた下に書き足します。

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

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

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

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

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

hatsu

2019/09/15 08:57

エラー文を見ると、redirect_to booker_path(booker) のあたりで、リダイレクトしたいけどどのページに行けばわからない(=BookerのID何番に行けばいいかわからない)といったことだと思います。 なので、 redirect_to booker_path(booker) が書かれているControllerのファイルをみてみたいです。 Svaeが出来ているか、出来ていない場合にどのページに飛ばすか、を書いてあげるような処理を追加するイメージを持っています。。
guest

回答1

0

ベストアンサー

bookerが作れてないのに、booker#showのページに飛ぼうとしているために起きているエラーと思われます。
そのため、bookerが作れていない場合の処理を追加しました。

ruby

1def create 2 booker = Booker.new(booker_params) 3 if booker.save #bookerを作れたら 4 redirect_to booker_path(booker) #作ったbookerのページへ遷移 5 else #作れてなかったら 6 root_path #トップページへ遷移 7 end 8end

投稿2019/09/15 09:14

hatsu

総合スコア1809

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

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

ryousukesatou

2019/09/15 10:19

わかりにくいですが、バリデーションはできてるみたいです。 ですが、 if分のelseのところで、一覧ページに飛びたいんです。 一覧ページには新規投稿機能もつけてます。どう指定すればいいのでしょうか?あと、デフォルトのエラーメッセージも表示したいです。 あと、
hatsu

2019/09/15 10:51

>if分のelseのところで、一覧ページに飛びたい → rails routes でbooker一覧のパスを調べ、redirect_to 〇〇_path とすれば可能です。bookers_path とかかと思います。 >デフォルトのエラーメッセージも表示したい というのは、View側でSubmitボタンを押した際に、空欄ならば表示する と言ったことがしたい認識で間違い無いでしょうか?
ryousukesatou

2019/09/15 11:12

そうですね。保存に失敗すると、もう一度一覧ページに戻って、 エラーメッセージを表示したいです。
hatsu

2019/09/15 11:18

>もう一度一覧ページ if booker.save redirect_to booker_path(booker) else bookers_path end な感じだと思います。 エラーメッセージは、FormのInputタグ等にrequiredをつければ、空の時にそもそも送信できない、かつ送信したらエラーメッセージが表示されるのでやりたいことが実現できるかもです。 参考:http://www.htmq.com/html5/input_required.shtml
ryousukesatou

2019/09/16 01:14

createアクションは一緒にしたのですが、別のエラーが出てきてしまいました。内容は質問元に現状を記述します。
hatsu

2019/09/16 01:43

app/views/bookers/index.html.erb に書いてある、@bookersというインスタンス変数が存在しないために起きているエラーです。 1. @bookersをControllerで定義してあげるか、 2. @bookersが無い場合の処理をView側で書いてあげる必要があります。 1の場合。 if booker.save redirect_to booker_path(booker) else @bookers = Booker.all bookers_path end 2の場合。 <% if @bookers %> <% @bookers.each do |booker| %> ... <% end %> <% end %> となります。
ryousukesatou

2019/09/16 04:39

1の内容でうまく行ったと思ったのですが、新しく内容を入力できませんでした。入力してもボタンが押せない状況です。
ryousukesatou

2019/09/16 06:02

すいません。できました。 あとエラーメッセージについてですが、オススメしていただいたサイトであった感じではないんです。赤枠が出て、その中にエラーメッセージを表示する感じにしたいんです。
hatsu

2019/09/16 06:09

エラーメッセージの動きとしては問題ないですか? 「エラーメッセージを赤枠で。。」はそれだけだとイメージは共有しきれないですが、以下のようなサイトが参考になるかもです。jQueryValidation Railsで調べれば記事は出てきます。 https://qiita.com/NT90957869/items/84ca64d145f8ef9c4fdd この使い方については、このQ&Aで行うと少し問題から離れてくるのでご自身でやってみて、またうまく行かなければご質問を立てていただければと思います。
ryousukesatou

2019/09/16 07:03

そのほうが僕もやりやすいですよね。 ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問