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

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

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

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

Ruby

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

バリデーション

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Q&A

解決済

1回答

1448閲覧

Ruby on RailsのModelのバリデーションについて

backroll

総合スコア3

Ruby on Rails 5

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

Ruby

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

バリデーション

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

0グッド

1クリップ

投稿2020/04/27 15:41

編集2020/04/27 16:01

Rails歴3年目の初級〜中級者です。Ruby on RailsのModelのバリデーションについて質問があります。
以下のようなModelが存在し、新規作成する場合にカラムの組み合わせのバリデーションの実装方法が分かりません。
例えば、フォームのcategoryで「車」を選んだ場合、kindは「レクサス」以外はバリデーションエラーになるように実装したいです。
同じように、フォームのcategoryで「パソコン」を選んだ場合、kindは「windows」か「Mac」以外はバリデーションエラーになるようにしたいです。
さらに、フォームのcategoryで「家電」を選んだ場合、kindは「炊飯器」か「冷蔵庫」以外はバリデーションエラーになるようにしたいです。
どうぞ、アドバイスなどよろしくお願い致します。

app/models/item.rb # id :integer not null, primary key # sales_company :string(255) # 販売会社 # serial_number :string(255) # シリアルナンバー # category_id :integer # カテゴリー分類 # kind_id :integer # 種類分類 # created_at :datetime not null # 作成日時 # updated_at :datetime not null # 更新日時
qpp/models/category.rb class Category < ActiveHash::Base self.data = [ {id: 1, name: '車'}, {id: 2, name: 'パソコン'}, {id: 3, name: '家電'} ] end
qpp/models/kind.rb class Kind < ActiveHash::Base self.data = [ {id: 1, name: 'レクサス'}, {id: 2, name: 'windows'}, {id: 3, name: 'Mac'}, {id: 4, name: '炊飯器'}, {id: 5, name: '冷蔵庫'} ] end
app/views/items/new.html.erb <%= form_for @item do |form| %> <%= form.label :sales_company %> <%= form.text_field :sales_company %> <%= form.label :serial_number %> <%= form.text_area :serial_number %> <%= form.label :category_id %> <%= form.text_area :category_id %> <%= form.label :kind_id %> <%= form.text_area :kind_id %> <%= form.submit %> <% end %>

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. validates を使った高級テクニックが有るかもしれませんが、それは私にも難しそうなので手軽な方法
validate :kind_is_valid? def kind_is_valid? if kindが正しくなかったら errors.add(....) end end

という方法なら書けそうですか?

2)「kindが正しくなかったら」部分ですが、Kindのデータ構造を直したほうが良いですね。
今の Category、Kindの数でしたら何とかなりますが、増えてきた時に手に負えなくなります。
{id: 1, name: 'レクサス', category_id: 1}
の様にすれば書きやすいでしょう。

投稿2020/04/29 05:32

winterboum

総合スコア23329

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

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

backroll

2020/05/14 05:23

ご回答ありがとうございます! def kind_is_valid? ~ end のパターンでいけました。 しかし、ご指摘いただいた通りデータ構造があまりよろしくないと思いますので、見直してみます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問