ume

rails tutorial フラッシュのバグについて

前書き

今現在rails tutorialを学習している初心者です。 学習中にフラッシュのバグに遭遇したので今日はその原因と解決策を共有することでまだ私のような初心者の方の力になればと思い記事を作成しています。

目次 

①フラッシュのバグ発生、私の期待した挙動、問題点について.
②原因と解決策.

フラッシュのバグ発生、私の期待した挙動、問題点について.

バグの内容フラッシュが消えない.

.
私の期待した挙動はlog inページで2つのフォームの中を空欄のままログインすると画面上部に'Invalid email/password をlog inページの中でだけ表示させようとしました.

ただ問題はhelpページにページ遷移してもフラッシュが消えず残ったままであること.

経緯. ログインが成功したり失敗すると画面上部に何かしらの文章を一時的に表示しようと思いフラッシュという機能(好きな文字を一時的に表示する機能)を実装しようと以下のコードをコントローラーに入力しました

# POST /login 
  def create 
    user = User.find_by(email: params[:session][:email].downcase)
     if user && user.authenticate(params[:session][:password])
       #成功
       log_in user
       redirect_to user 
     else 
       #失敗
       flash[:danger] = 'Invalid email/password 
       render "new"
     end 
  end 

②原因と解決策

原因は2つ ①flashの挙動を漠然と理解していただけで具体的に理解できていなかった.
flash + redirect toとflash + renderの組み合わせの挙動の違いを理解していなかった.

①について.
私のflashの理解は文字を一時的に画面に表示する。 正しい理解は一時的にではなく「次のリクエスト(postリクエストやgetリクエストなど)がくるまで表示する」 ②redirect_to newとした場合 users/newにリクエストが送られて⇨new.htmlファイルが表示される。なのでnew.htmlファイルが開かれた時にはもうすでに1回リクエスト飛ばしたことになるのでnew.htmlファイルから別のファイルにページ遷移した時フラッシュは消える。 ただrender new を使うとリクエストを経由せず直接呼び出すのでnew.htmlファイルを開いた時にはまだリクエストは0回なのでhelpページに遷移したとしてもそこでようやく1回目のリクエストがカウントされるのでフラッシュが消えなかった。

解決策

flashとrenderを組み合わせて使う場合

 flash[:danger] = 'Invalid email/password 

 flash.now[:danger] = 'Invalid email/password 

.nowを追加する

rails tutorial 6章 データベース復習

 #前書き

今現在rails tutorial10章に取り組んでいるのですが以前やった内容の理解度が章を重ねるごとに低いなぁと感じたため理解を深めるため復習します。 また同じようにrails tutorialに取り組んでいる方の参考になればと思い記事にしています。

目次

①データベースのバリデーションって何?なぜバリデーションが必要なのか.
②バリデーションを設定するまでの流れ

①データベースのバリデーションって何?なぜバリデーションが必要なのか

バリデーションとはデータベースに情報を保存する前にデータの中身が正しいかどうかをチェックするためのもの。 正しくないものはエラーを出す なぜバリデーションが必要なのか 正しいデータかどうかは自分が決める.
例えばUserの情報が入っているUserモデルがあったとしてそこにユーザーさんからメールアドレスを保存してもらう場合フォームのメールアドレスが空白で登録しようとして、空白がデータベースに保存されてしまうと後からユーザーさんのメールアドレスにメールを送ろうとしても空白で登録されているのでメールを送ることができない。 なので登録時にメールアドレスの欄が空白だと登録できませんといったバリデーションをかける必要がある。メールアドレスは空欄ではいけない=正しいデータと設定することでメールアドレスの欄が空白だとエラーを返す。

②バリデーションを設定するまでの流れ

①テストを書く.
②バリデーションの設定.

①テストを書く.
まず正解のテストとこういう情報がデータベースに登録されようとしたら ダメだよねっていうテストを書く test/modelsの中のファイルにこんな感じで書く

require 'test_helper'

class UserTest < ActiveSupport::TestCase

#正解の情報
def setup
    @user = User.new(name: "Example User", email: "user@example.com", 
                      password: "foobar",
                      password_confirmation: "foobar")

end
#上の情報がデータベースに渡されようとした時オッケーだよね?っていうテスト
  test "should be valid" do
    assert @user.valid?
  end
  
  #こういう情報がデータベースに登録されようとしたら
ダメだよねっていうテスト
  test "name should be present" do
    @user.name = "     "
    assert_not @user.valid?
  end

②バリデーションの設定. こういう情報がデータベースに登録されようとしたら ダメだよねっていうバリデーションを書く app/models

validates :name,  presence: true

書き方はvalidates :カラム名, presense: true⇦空はダメっていう意味。つまりnameカラムは空欄ではいけないよって意味

rails provideについて

前書き

今現在rails tutorial10章に取り組んでいるのですが以前やった内容の理解度が章を重ねるごとに低いなぁと感じたため理解を深めるため復習します。 また同じようにrails tutorialに取り組んでいる方の参考になればと思い記事にしています。

目次

①provideの意味と役割.
②どういう時に使う?
③使い方.

①provideの意味と役割

provideとは日本語で「供給する」という動詞です.
役割⇨provideは『ファイルをまたいで使える「変数」のような役割を持ちコードの可読性(コードの読みやすさ)を上げる』

②どういう時に使う?

⇨同じコードが重複しないようにしたい時(リファクタリングという)⇨可読性があがる 具体例を挙げてみる 例えば 画面のhelpをクリックするとhelpのページに遷移するページがあるとします。aboutページも同様 画面上部に注目してください。 ↓ここに注目 .

↓ここに注目

上4つの画像で伝えたいことは 『ページごとに画面上部のタイトル部分が変わっている』ということです。

もしページごとにタイトルが変わるようにするためには 以下のようにコードを書く必要がある。 helpページの場合

<!DOCTYPE html>
<html>
  <head>
    <title>Help | Ruby on Rails Tutorial Sample App</title>
  </head>
  <body>
    <h1>Help</h1>
  </body>
</html>

help.html.erbファイル内のtitleタグの中にhelpと記載する 同様にabout.html.erbファイルにいき

<!DOCTYPE html>
<html>
  <head>
    <title>About | Ruby on Rails Tutorial Sample App</title>
  </head>
  <body>
    <h1>About</h1>
  </body>
</html>

Aboutというふうに記載する必要がある。 このやり方でも『ページごとにタイトルを変化させること』はできます。 ただ全体のページの中のタイトルの一部分だけ変更したいだけなのに

<!DOCTYPE html>
<html>
  <head>
    <title>| Ruby on Rails Tutorial Sample App</title>
  </head>
  <body>
  </body>
</html>

ここの部分のコードが重複してしまっていてファイルが増えていくことを想定するとコードの量が増え読むのに時間がかかり可読性が下がる。 そういう時にprovideを使う。

③使い方.

①変数のようにhtml内に<% provide(:①好きな文字, "②好きな文字") %> と記載.
②②の好きな文字を使いたいファイル内(だいたいapplication.html.erb)で<%= yield(:①の好きな文字) %>と記載.
③重複しているコードをabout.html.erbとhelp.html.erbから削除

コードで見てみよう application.html.erbに<%= yield(:①の好きな文字) %>

①<% provide(:title, "Help") %> 
#titleという変数にHelpを代入しているイメージです
<!DOCTYPE html>
<html>
  <head>
    <title>②<%= yield(:title) %>| Ruby on Rails Tutorial Sample App</title>
#titleの中に入ったHelpを使いたい場合はさっき作ったtitleをyield(:title) の引数に入れる。
yieldはtitleの中身表示してという意味
  </head>
  <body>
  <%= yield %>
#各viewファイル(aboutやhelpファイルが1個ずつここに入るイメージ)
  </body>
</html>

補足.
application.html.erbの仕組み

rails tutorial 3章 前編 復習

前書き 

今現在rails tutorial10章に取り組んでいるのですが以前やった内容の理解度が章を重ねるごとに低いなぁと感じたため理解を深めるため復習します。 また同じようにrails tutorialに取り組んでいる方の参考になればと思い記事にしています。

目次

①テストとは.
②なぜテストを行うのか.
③テストの種類と使い方.
④最後に

テストとは

人間の代わりにコンピューターにアプリが想定通り動作するかを確認してもらうこと。

例えば (人間がテストする場合の例) このようなサンプルアプリというTwitterのようなアプリ(作りかけの段階)があった場合、このアプリを世の中に出す前に自分が想定した通りに実装できているか確認する必要がある。その際自分で画面上部のhelpというボタンをクリックして↓の画面のように『ちゃんとhelpページに画面が切り替わっているわぁと』1つ1つチェックする必要がある これをuserページcontactページと全てのページを人間が1つ1つ調べるのは時間もかかるし、チェックし忘れる可能性が出てくる

そこでテスト(人間の代わりにコンピューターにちゃんと動作するか調べてもらう)を使う。

なぜテストを行うのか

①不具合がないかを調べる.
②不具合が出た時に解決までの時間を軽減できる.

テストの種類

①コントローラテスト.
②モデルテスト.
③総合テスト.

①コントローラテストの意味.
文字通りコントローラが不具合なく動くかどうかを調べてくれるテストです.
不具合なくとは.
①ルーティングの設定は適切なものかどうか.
②コントローラの中に適切なアクションは入っているか.
③アクションに対するviewがあるかどうか.
などを調べてくれます.
テスト実行までの流れ使い方.
①テストを書く.
rails test コマンドをターミナルで入力.
③不具合があるのかないのか教えてくれる.
どこにテストを書くのか test/controllers/コントローラ名.test.rbに書く
このテストを書くためのコントローラーは app/controllers/コントローラを作るために入力された

rails generate controller ~

↑このコマンドを入力すると作られる つまりrails generate controller コマンドを使うと2つのコントローラが作られる。内1つはテスト用のコントローラー

コントローラーテストの中身を見てみよう ↓例homeページとhelpページのテスト

require 'test_helper'

class StaticPagesControllerTest < ActionDispatch::IntegrationTest

  test "should get home" do
    get static_pages_home_url
    assert_response :success
  end

  test "should get help" do
    get static_pages_help_url
    assert_response :success
  end
end

1行1行の意味を見ていこう

    get static_pages_home_url

urlの末尾に/homeを追加するとgetリクエストが送られるよねって意味

    assert_response :success

successで何かしらのhtmlが表示されるよね?って意味 assertは〜だよねぐらいの訳でオッケー responseは反応 まとめるとurlの末尾に/homeをつけてエンター押すと何かしらのhtmlが返ってくるよねって意味.
最後にターミナルでrails test を入力すると 不具合あるのかないのか教えてくれる.
不具合ない場合(urlの末尾に/homeと追加しエンター押して何かしら画面に表示された時=テスト通りになった時) 緑色の‥が表示される。またfailureが0.
不具合がある場合 赤文字でEかFが表示されてどこがいけないのかを教えてくれる。

最後に

テストを行う手順として.
①テストを書く⇨まずrails testを失敗させる.
②テストが通るよう(成功になるよう)に実際にコードを書く.
リファクタリング.

②モデルテスト.
③総合テスト. ↑2つに関しては今回記事が長くなったので次回の記事で書きます。

rails test のエラーの読み方

前書き

私はrails tutorialに取り組んでいる初心者でよくエラーの読み方がわからず簡単なエラーにもたくさんの時間をかけ学習効率を落としています。なので同じように「エラーを早く解決したいと思う同じ初心者」の方向けに記事を書いています。

エラーの事例

Failure:
UsersLoginTest#test_login_with_invalid_information [/home/ubuntu/environment/sample_app/test/integration/users_login_test.rb:11]:
Expected false to be truthy.

エラーの背景 rails tutorialでツィッターのようなものを作成している際に自らテストを書いてテストを実行したところテストが失敗した時のエラーについてです。下記が私のテストです

  test "login with invalid information" do
    get login_path
    assert_template 'sessions/new'
    post login_path, params: { session: { email: "", password: "" } }
    assert_template 'sessions/new'
    assert_not flash.empty?
    get root_path
    assert flash.empty? ⇦11行目
  end

エラーの読み方

まず前提として全てのエラーコードを解る必要はない 「どこがどう間違っているのかを把握すること」 が大事だと初心者ながら思います。 なので具体的にどこのフォルダーの中のファイルの何行目がどう間違っているかを知る。

[/home/ubuntu/environment/sample_app/test/integration/users_login_test.rb:11]:

↑がどこのフォルダーの中のファイルの何行目がおかしいかを教えてくれています。 私の場合integrationフォルダーのusers_login_test.rbの11行目がおかしい。 見てみると

assert flash.empty?

この部分がおかしいと言っている どうおかしいか?

Expected false to be truthy.

テストの中でassert flash.empty?は失敗するはずなのに実際テストをしてみると成功してしまう。

まとめ

私のテストコードの要約 あるページではフラッシュして それ以外のページに飛んだ時フラッシュは消してという意味 フラッシュとは↓アプリのログインとかの際に失敗or成功したときに一瞬画面に出てくる表示のこと 下で言う赤い部分 (

テストではあるページの際だけフラッシュを出してと言っているが実際は全てのページでフラッシュが出ているのでおかしいよとエラー入っている

rails consoleが反応しない原因と解決策

前書き

rails tutorialの7章でrails consoleを使用しデータベースのUser tableにレコードを追加しようとしたときに遭遇した不具合についての記事を書きたいと思います。

遭遇した不具合

rails consoleが反応しない 具体的にコマンドを打っても何も処理が行われない。

原因

rails consoleを開いたまま別のターミナルで作業したり rails consoleを使わないのに起動したまま別の作業をしたりすることが原因でした。

解決策

①ps axww | grep spring rails consoleを動かすと、springというプロセスが一緒に走るらしいので、それを探して見ました。

②kill -9 4桁の数字 ①で表示された4桁の数字をとkillコマンドを使ってspringというプロセスを削除

rails tutorial 6章 エラー

r前書きrails tutorial6章を進めるうちにエラーが発生したので

原因と解決策をシェアし、自身の理解を深めるとともに同じ境遇の方に少しでも役に立っていただけるように記事を作成しています。

エラー

エラーの経緯

データベースに同じ値が入らないようにバリデーションをつけようとし、最後の確認でrails t コマンドでテストしようとした際に発生しました。

エラーの意味

重複した値を入れたらあかんって設定してるけど何か重複してるよって意味

解決策

重複しているものを削除する。 test/fixturesの中のファイルを修正する 同じものが二つあるので1つ消しました。 この状態でrails test を行うとエラーが出ることなくテストできました。