前提・実現したいこと
Ruby on Railsで下記のようなエラーがテストで表示されます。しかしブラウザ上ではエラーが発生しません。
@feedsがテストではnilになるみたいなんですが、ブラウザ上ではしっかり動き、binding.pryをつかって@feedsを確認してみても、しっかりデータがあり、nilではありません。testの書き方に問題がありhomeアクションがうまく機能していないんじゃないかと思っています。
発生している問題・エラーメッセージ
Error: PostsControllerTest#test_login_post: ActionView::Template::Error: 'nil' is not an ActiveModel-compatible object. It must implement :to_partial_path. app/views/pages/home.html.erb:12:in `_app_views_pages_home_html_erb__1017084688_157018920' app/controllers/posts_controller.rb:8:in `create' test/controllers/posts_controller_test.rb:32:in `block (2 levels) in <class:PostsControllerTest>' test/controllers/posts_controller_test.rb:31:in `block in <class:PostsControllerTest>'
該当のソースコード
テスト内容
ruby
1require 'test_helper' 2 3class PostsControllerTest < ActionDispatch::IntegrationTest 4 def setup 5 @user=users(:michael) 6 end 7 8 test "login post" do 9 get login_path 10 post login_path params:{session:{name:@user.name,password:'password'}} 11 get root_path 12 assert_difference 'Post.count',1 do 13 post posts_path, params: { post: { content: "Lorem ipsum" } } 14 end 15 assert_template 'pages/home' 16 assert_not flash.empty? 17 assert_no_difference 'Post.count' do 18 post posts_path, params: { post: { content: "" } } 19 end 20 assert_select 'div#error_explanation' 21 end 22end 23
view home.html.erb
ruby
1<% if log_in?%> 2 <h2><%=current_user.name%></h2> 3 <%= form_with model:@post,url:posts_url,local:true,class:"container" do |f|%> 4 <%= render 'shared/error_messages',model: f.object %> 5 <div class="form-group "> 6 <%= f.label :content%> 7 <%= f.text_field :content,class:"form-controll"%> 8 </div> 9 <%= f.submit "post",class:"btn btn-primary"%> 10 <%end%> 11 <ol> 12 <%= render @feeds%> 13 </ol> 14<% else%> 15 <h1>Pages#home</h1> 16 <p>Find me in app/views/pages/home.html.erb</p> 17<% end%>
controller
ruby
1class PagesController < ApplicationController 2 def home 3 if log_in? 4 @post=current_user.posts.build 5 @feeds=current_user.feed 6 end 7 end 8end 9
メソッド feed
ruby
1class User < ApplicationRecord 2 has_many :posts, dependent: :destroy 3 before_validation :delete_whitespace 4 validates :name, presence: true, length: { maximum: 50 },uniqueness: true 5 has_secure_password 6 validates :password, presence: true, length: { minimum: 6 }, allow_nil: true 7 def User.digest(string) 8 cost = ActiveModel::SecurePassword.min_cost ? BCrypt::Engine::MIN_COST : 9 BCrypt::Engine.cost 10 BCrypt::Password.create(string, cost: cost) 11 end 12 13 def feed 14 Post.where("user_id = ?", id) 15 end 16 private 17 def delete_whitespace 18 self.name = name.strip 19 end 20end 21
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
質問
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
該当のソースコード
ソースコード
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
質問
ここに質問の内容を詳しく書いてください。
(例)PHP(CakePHP)で●●なシステムを作っています。
■■な機能を実装中に以下のエラーメッセージが発生しました。
該当のソースコード
ソースコード
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
あなたの回答
tips
プレビュー