実現したいこと
- 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が返ってきてしまいます。
どこが間違っているのか見当付かず質問させて頂きました。
情報が足りないところがございましたらご指摘お願いします。
よろしくお願いします。
あなたの回答
tips
プレビュー