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

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

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

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Ruby on Rails 4

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

Q&A

解決済

1回答

4199閲覧

【Rails】ネストしたモデルのバリデーションについて

ippo_abc

総合スコア12

Model

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

RSpec

RSpecはRuby用のBDD(behaviour-driven development)フレームワークです。

Ruby on Rails

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

Ruby on Rails 4

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

0グッド

0クリップ

投稿2016/02/09 19:04

編集2016/02/09 19:14

以下のような1対多の関係であるitemモデルとattachmentモデルを作りました。
これらを同一アクションで一括保存するためにaccepts_nested_attributes_forを利用しています。

viewのフォームから登録する際はattachmentモデルのvalidates :url, presence: trueがうまく動作するのですが、
以下のようなテストの場合、validates :url, presence: trueが動作せずにテストを通ってしまいます。

原因がわかる方、教えていただけないでしょうか?
よろしくお願いします。

Attachment.rb

# Table name `attachments` # Name | Type | Attributes # ----------------- | ------------------ | --------------------------- # **`id`** | `integer` | `not null, primary key` # **`item_id`** | `integer` | `not null` # **`url`** | `string(255)` | `not null` # **`created_at`** | `datetime` | `not null` # **`updated_at`** | `datetime` | `not null` class Attachment < ActiveRecord::Base validates :item, presence: true validates :url, presence: true #itemとattachmentは1対多 belongs_to :item, inverse_of: :attachments end

Item.rb

# Table name `items` # # Name | Type | Attributes # ----------------- | ------------------ | --------------------------- # **`id`** | `integer` | `not null, primary key` # **`title`** | `string(255)` | `not null` # **`content`** | `text(65535)` | # **`created_at`** | `datetime` | `not null` # **`updated_at`** | `datetime` | `not null` class Item < ActiveRecord::Base # titleは必須 validates :title, presence: true # itemとattachmentsは1対多 has_many :attachments, inverse_of: :item, dependent: :destroy accepts_nested_attributes_for :attachments end

items/new.html.slim

= form_for @item do |f| = f.label :title = f.text_field :title = f.label :content = f.text_field :content = f.fields_for :attachments do |c| = c.label :url = c.text_field :url = f.submit

items_controller.rb

def new @item = Item.new @item.attachments.build end def create @item = Item.new(item_params) if @item.save redirect_to( {action: :index}, notice: '投稿しました。' ) else render :new end end def item_params params.require(:item).permit(:title, :content, attachments_attributes: :url) end

items_controller_spec.rb

describe "#create" do it "create new item" do expect { post :create, item: { title: 'title', content: 'content' } }.to change { Item.count }.from(0).to(1) end end

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

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

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

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

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

guest

回答1

0

ベストアンサー

テストを見るとItem単体を作成してItemをテストしているように見えます。

Attachmentはurlがあることを検証していますが、ItemはAttachmentがなくてもよいため、titleを検証して保存できています。

パラメーターに、attachments_attributesを含めるか、
Attachmentが存在するvaridationを追加してはどうでしょうか。

投稿2016/02/16 15:36

miyamiya

総合スコア691

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問