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

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

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

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

Ruby

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

Q&A

解決済

3回答

3472閲覧

Railsのモデルにバリデーションを記述しても効かず、困っています。。。

shohei0718

総合スコア17

Ruby on Rails 5

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

Ruby

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

0グッド

0クリップ

投稿2018/12/06 07:48

編集2018/12/06 08:17

はじめての質問です!
お忙しいなか、恐れいりますが、宜しくお願い致します

※質問内容にクレジットカードと記載がありますが、今回のコードはサンプルで作成しているだけなので、
自身のPCのローカル環境でのみ動かしています。

開発環境

Rails 5.0.1
Ruby 2.3.1

前提・実現したいこと

バリデーションを効かせることで、入力フォームが空欄のときに
エラーメッセージが出るようにしたい。

発生している問題

modelにバリデーションの記載をしてもバリデーションが効かない

Ruby

1 2 3class PaymentInformation < ApplicationRecord 4 belongs_to :user 5 6 validates :card_number, presence: true 7 validates :valid_year, presence: true 8 validates :valid_month, presence: true 9 validates :cvc, numericality: true 10 11end 12

HTML

1%section.payment_information-container 2 .content-title 3 %h2 クレジットカード情報入力 4 .form-content 5 .form#credit-information 6 = form_for @payment_information,url: payment_informations_path, method: :post do |f| 7 = f.label 'カード番号', class: 'label' 8 %span 必須 9 %br/ 10 = f.number_field :card_number,class: 'number',id: 'card_num' 11 = f.label '有効期限', class: 'label' 12 %span 必須 13 .selectbox 14 = f.select :valid_month,[*(1..12)],prompt:"選択してください",class: 'valid_month' 15 %p 月 16 17 .select-valid 18 = f.select :valid_year,[*18..23],prompt:"選択してください",class: 'valid_month' 19 %p 年 20 21 = f.label 'セキュリティコード', class: 'label' 22 %span 必須 23 = f.text_field :cvc, placeholder:' カード背面4桁もしくは3桁の番号',class: 'number',id: 'security_num',minumum:3, maximum:4 24 .submit-box 25 =f.submit '追加する', class: 'submit' 26

試したこと

マイグレーションファイルのカラムにnull false制約を加えてみました。
validateをvalidatesにしてみました。

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

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

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

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

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

maisumakun

2018/12/06 07:54

あくまでサンプルだと信じたいですが、カード番号を保存するにはPCI DSSのルールに則った仕組みの構築が必要ですし、セキュリティコードは保存が一切禁止されています。
shohei0718

2018/12/06 08:02

質問内容に不備があり、申し訳ございません。今回のコードはサンプルで作成しているだけなので、自身のPCのローカル環境でのみ動かしています
maisumakun

2018/12/06 08:21

「バリデーションが効かない」というのはどのような状況でしょうか。「そのまま保存されてしまう」「エラーにはなるけどエラーメッセージがわからない」など、不適当な値を入れるとどうなるのか教えていただけますでしょうか。
shohei0718

2018/12/06 08:35

現在の状況ですが、フォームが空欄の状態でSubmitボタンを押してもブラウザの表示が全く変わりません。モデルにpresence:trueを記述しているので、何らかのエラーメッセージが出るはずなのですが、エラーメッセージも出ません。Submitした空欄の情報はDBには保存されていない状態です。
guest

回答3

0

自己解決

下記の記述で解決することができました。
ありがとうございます!!

##Gemfile gem 'rails-i18n' ##config/locales/ja.yamlを作成 ja: attributes: card_number: カード番号 valid_year : 有効期限の年 valid_month: 有効期限の月 cvc : セキュリティコード ##html.haml -if @payment_informations.error.any? =render 'layouts/error_messages', model: f.object ##views/layout/_error_messages - if model.errors.any? .alert.alert-warning %ul - model.errors.full_messages.each do |message| %li = message ##controller def create @payment_information = PaymentInformation.create(payment_information_params) if @payment_information.save redirect_to action: :index else render :new end end

投稿2018/12/07 11:36

shohei0718

総合スコア17

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

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

0

Controller 側の実装はどうなっているでしょうか?
validateエラー時は render でフォームを描画する必要があります

もし redirect_to でフォーム画面に戻っていたら、 新しく読み込み直した @payment_information を使って描画しているため、エラー情報が消えます

投稿2018/12/07 04:19

Ighrs

総合スコア656

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

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

shohei0718

2018/12/07 11:35 編集

ご回答頂きまして、ありがとうございます! ただ、下記の記述で問題を解決することができました。 お知恵を頂いたにも関わらず、申し訳ございません。。。 ``` ##Gemfile gem 'rails-i18n' ##config/locales/ja.yamlを作成 ja: attributes: card_number: カード番号 valid_year : 有効期限の年 valid_month: 有効期限の月 cvc : セキュリティコード ##html.haml -if @payment_informations.error.any? =render 'layouts/error_messages', model: f.object ##views/layout/_error_messages - if model.errors.any? .alert.alert-warning %ul - model.errors.full_messages.each do |message| %li = message ##controller def create @payment_information = PaymentInformation.create(payment_information_params) if @payment_information.save redirect_to action: :index else render :new end end ```
guest

0

現在の状況ですが、フォームが空欄の状態でSubmitボタンを押してもブラウザの表示が全く変わりません。

おそらく、現状は「バリデーションエラーとなっているけれど、エラーメッセージを表示していないために反応しているのかも定かではない」状態になっているのではないかと思われます。

とりあえず、<%= @payment_information.errors.inspect %>とすれば、モデルがどのようなエラーメッセージを生成しているか確認できます。

投稿2018/12/06 08:56

maisumakun

総合スコア145183

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

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

shohei0718

2018/12/06 10:59

ありがとうございます。 HTMLにご教授頂いた <%= @payment_information.errors.inspect %>を入れると、 下記のようなエラー文が出てきました。 #<ActiveModel::Errors:0x007fbffeafcb00 @base=#<PaymentInformation id: nil, card_number: nil, valid_year: nil, valid_month: nil, cvc: nil, created_at: nil, updated_at: nil, user_id: nil>, @messages={:カード番号=>[], :card_number=>[]}, @details={}> もう少し自力での解決を試みます!
shohei0718

2018/12/06 12:15 編集

エラー文をビューで表示させるために下記記述をし、フォームが空欄の状態でSubmitボタンを押しても何もビューに表示されずに困っています。。。 - if @payment_information.errors.any? %p エラーです。 先程ご教授頂いたコードを記述して、#<ActiveModel::Errors:0x007fbffeafcb00 〜というエラー文が出たので、エラーは検知しているとは思うのですが、なぜエラー文が表示されないのでしょうか
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問