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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

Q&A

解決済

2回答

1169閲覧

Railsテストのエラーを解決したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Ruby on Rails

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

0グッド

0クリップ

投稿2020/05/14 12:19

編集2020/05/15 12:02

前提・実現したいこと

Railsテストを書いていて発生したエラーを解決したい

下記アプリ内にRailsテストを書いています。
https://github.com/mkakiz/tadakashi_app/tree/rails-test

rails

1(app/test/controllers/home_controller_test.rb) 2require 'test_helper' 3 4class HomeControllerTest < ActionDispatch::IntegrationTest 5 test "should get about" do 6 get about_url 7 assert_response :success 8 end 9end

rails

1get "about", to: "home#about"

rails

1(controllers/home_controller.rb) 2 def about 3 end

上記のテストで私の認識としては以下のようになると思っています。
・Aboutページに対してテストを行う
・GETリクエストをAboutアクションに対して行う
・リクエストに対するレスポンスは[成功]になる…はず

発生している問題・エラーメッセージ

しかしテストは以下のエラーとなりました。
(home_controller_test.rb:4 は test "should get about" do です)

Error: HomeControllerTest#test_should_get_about: Mysql2::Error: Field 'user_id' doesn't have a default value Error: HomeControllerTest#test_should_get_about: NoMethodError: undefined method `each' for nil:NilClass bin/rails test test/controllers/home_controller_test.rb:4 Finished in 0.570363s, 1.7533 runs/s, 0.0000 assertions/s. 1 runs, 0 assertions, 0 failures, 1 errors, 0 skips

試したこと

’Each’についてはどれについてはそもそもどれを指しているのかが分からなかったのですが、
‘Mysql2’については下記のページに「MySQLの設定ファイル(my.cnf)を書き換えましょう」という記述が見つかりました。
https://qiita.com/seltzer/items/3096f0805440bfa19bff
しかし残念ながら該当ファイルを見つけられずにいます。
MySQLはインストールしていますので、設定ファイルはあると思うのですが…。

% mysql --version mysql Ver 8.0.19 for osx10.15 on x86_64 (Homebrew)

すみませんが、アドバイスをお願いします。

追加:

(about.html.erb) <div class="about-main" align="center"> <h2>タダカシとは</h2> <p> ... </p> <img class="about-img" src="/gift.jpg"> </div>
(application.html.erb) <!DOCTYPE html> <html> <head> <title>タダカシ</title> <!-- Latest compiled and minified CSS --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css" integrity="sha384-HSMxcRTRxnN+Bdg0JdbxYKrThecOKuH5zCYotlSAcp1+c8xmyTe9GYg1l9a69psu" crossorigin="anonymous"> <!-- Optional theme --> <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap-theme.min.css" integrity="sha384-6pzBo3FDv/PJ8r2KRkGHifhEocL+1X2rVCTTkUfGk7/0pbek5mMa1upzvWbrUbOZ" crossorigin="anonymous"> <%= csrf_meta_tags %> <%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %> <%= javascript_include_tag 'application', 'data-turbolinks-track': 'reload' %> <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css"> </head> <body> <header> <div class="header-logo"> <% if @current_user %> <button type="submit" class="btn btn-success"><%= link_to("タダカシ", "/posts/index") %></button> <% else %> <button type="submit" class="btn btn-success"><%= link_to("タダカシ", "/") %></button> <% end %> </div> <ul class="header-menus"> <% if @current_user %> <li> <%= link_to(@current_user.name, "/users/#{@current_user.id}") %> </li> <li> <button type="submit" class="btn btn-primary"><%= link_to("投稿一覧", "/posts/index") %></button> </li> <li> <button type="submit" class="btn btn-primary"><%= link_to("新規投稿", "/posts/new") %></button> </li> <li> <button type="submit" class="btn btn-primary"><%= link_to("ユーザー一覧", "/users/index") %></button> </li> <li> <button type="submit" class="btn btn-primary"><%= link_to("ログアウト", "/logout", {method: :post}) %></button> </li> <% else %> <li> <button type="submit" class="btn btn-success"><%= link_to("タダカシとは", "/about") %></button> </li> <li> <button type="submit" class="btn btn-primary"><%= link_to("新規登録", "/signup") %></button> </li> <li> <button type="submit" class="btn btn-primary"><%= link_to("ログイン", "/login") %></button> </li> <li> <button type="submit" class="btn btn-warning"><%= link_to("かんたんログイン", "/guest_login") %></button> </li> <% end %> </ul> </header> <% if flash[:notice] %> <div class="flash"> <%= flash[:notice] %> </div> <% end %> <%= yield %> </body> </html>
(user_controller.rb) def login @user = User.find_by(email: params[:email]) if @user && @user.authenticate(params[:password]) session[:user_id] = @user.id flash[:notice] = "ログインしました" redirect_to("/posts/index") else @error_message = "メールアドレスまたはパスワードが間違っています" @email = params[:email] @password = params[:password] render("users/login_form") end end def logout session[:user_id] = nil flash[:notice] = "ログアウトしました" redirect_to("/login") end

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

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

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

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

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

winterboum

2020/05/14 12:33

aboutのviewに問題がありそうです。それを載せてください
退会済みユーザー

退会済みユーザー

2020/05/14 14:29

レスありがとうございます! aboutを追加しました。 あと念のためapplication.html.erbも追加しました。
winterboum

2020/05/14 21:12

application.html.erb で @current_user を使っていますが、これはどこで定義してますか?
退会済みユーザー

退会済みユーザー

2020/05/14 23:28

application_controller.rbの def set_current_user @current_user = User.find_by(id: session[:user_id]) end で定義していると思ってます。
winterboum

2020/05/14 23:34

home_controller の about のときにもそれが実行される様になっているのですね?
退会済みユーザー

退会済みユーザー

2020/05/14 23:46

そうですね
guest

回答2

0

about の表示に @current_user = User.find_by(id: session[:user_id]) が呼ばれています。
が、loginしていないので session[:user_id] が nil です。

test "should get about" do get about_url assert_response :success end

に login状態にするのを入れてください。
ユーザー管理に何を使っているかで変わりますが例えばDeviseだと

let!(:user) { create(:user) } before do login_user(user) end

投稿2020/05/15 00:00

winterboum

総合スコア23401

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

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

退会済みユーザー

退会済みユーザー

2020/05/15 02:12

ご回答ありがとうございました。 残念ながらユーザー管理にはDevise gemではなくsessionを作ったり消したりしています。 test "should get about" do let!(:user) { create(:user) } before do login_user(user) end get about_url assert_response :success end でテストを行ってみましたが、同じ結果になってしまいました。 Deviseを使わない場合は、どのようにlogin状態にすればいいでしょうか。 試しにRailsチュートリアルの一部を下記のように試してみましたが上手くいきませんでした。 (fixtures/users.yml) michael: name: Michael Example email: michael@example.com password_digest: <%= User.digest('password') %> (home_controller_test.rb) def setup @user = users(:michael) end test "should get about" do get about_url assert_response :success end Error: HomeControllerTest#test_should_get_about: NoMethodError: undefined method `digest' for #<Class:0x0000559494d3a3f0> test/fixtures/users.yml:4:in `get_binding' Error: HomeControllerTest#test_should_get_about: NoMethodError: undefined method `each' for nil:NilClass
winterboum

2020/05/15 03:49

>Deviseを使わない場合は、どのようにlogin状態にすればいいでしょうか。 逆に質問です。 いまのlogin管理で、どうやってlogin状態にしていますか?
退会済みユーザー

退会済みユーザー

2020/05/15 12:04

レスありがとうございます。 ユーザーコントローラー内にloginアクションを作り、ユーザーにsessionをつけてlogin状態にしています。 ユーザーコントローラーの一部を追記しました。
退会済みユーザー

退会済みユーザー

2020/05/15 23:19

session[:user_id]があるときだけ、current_userを持つようにする、というのはアリでしょうか? def set_current_user @current_user = User.find_by(id: session[:user_id]) if session[:user_id].present? end でテストしても結果としては同じエラーになってしまいましたが。
guest

0

ベストアンサー

本件解決しました。

session[:user_id]があるとき(ログイン中)だけ、current_userを持つようにして、

def set_current_user @current_user = User.find_by(id: session[:user_id]) if session[:user_id].present? end

fixtures/postsやcommentsのデータに、user_id:1を追加し、user_idがNilというエラーを回避。

最後に
get about_path
と修正したら通りました。

投稿2020/05/18 10:48

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問