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

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

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

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

Ruby

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

RSpec

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

Q&A

0回答

616閲覧

[Rails]FormObjectを作成したが、validatesが機能しません

machamp

総合スコア7

Ruby on Rails 5

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

Ruby

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

RSpec

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

0グッド

0クリップ

投稿2019/11/27 06:49

実現したいこと

  • FormObjectでvalidatesメソッドが機能すること
  • 次のテストがパスすること

ActiveModel::Modelをincludeしたのですが、何故かvalidatesメソッドが機能していません。

コードはこちらです。

Model

ruby

1class Article < ApplicationRecord 2 belongs_to :user 3 has_many :pictures, dependent: :destroy 4end 5 6class Picture < ApplicationRecord 7 belongs_to :article 8 9 mount_uploader :image, PictureUploader 10end

Controller

ruby

1class ArticlesController < ApplicationController 2 def create 3 @article = ArticleForm.new(article_params.merge(user_id: current_user.id) 4 if @article.save 5 redirect_to root_url 6 else 7 render :new 8 end 9 10 private 11 def article_params 12 params.require(:article_form).permit( 13 :title, 14 :content, 15 pictures_attributes: [:image] 16 ) 17 end 18end

FormObject

ruby

1class ArticleForm 2 include ActiveModel::Model 3 4 attr_accessor :title, :content, :user_id, :pictures_attributes 5 6 validates :title, presence: true 7 validates :content, presence: true 8 9 def save 10 return false if invalid? 11 12 article.assign_attributes(article_params) 13 build_association if pictures_attributes.present? 14 15 if article.save 16 true 17 else 18 false 19 end 20 end 21 22 private 23 def article 24 @article ||= Article.new 25 end 26 27 def build_association 28 pictures_attributes.each_value do |picture| 29 article.pictures << Picture.new(image: picture[:image]) 30 end 31 end 32 33 def article_params 34 { 35 title: title, 36 content: content, 37 user_id: user_id 38 } 39 end 40end

RSpec

ruby

1require "rails_helper" 2 3RSpec.describe ArticleForm do 4 let(:user) { FactoryBot.create(:alice) } 5 6 describe "#validates" do 7 let(:user) { FactoryBot.create(:alice) } 8 let(:valid_params) { FactoryBot.attributes_for(:alice_article) } 9 let(:article) { described_class.new(valid_params.merge(user_id: user.id)) } 10 11 subject { article.invalid? } 12 13 context "投稿が無効な時" do 14 it "titleが空白の場合無効であること" do 15 article.title = "" 16 expect(subject).to be_truthy 17 end 18 19 it "contentが空白の場合無効であること" do 20 article.content = "" 21 expect(subject).to be_truthy 22 end 23 end 24 end 25end

コードは以上になります。
rails consoleで article = ArticleForm.newとしてarticle.invalid?とすれば
validatesメソッドが機能してtrueが返ってくると思うのですが、falseが返ってきてしまいます。

どこが間違っているのか見当付かず質問させて頂きました。

情報が足りないところがございましたらご指摘お願いします。

よろしくお願いします。

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問