rails 独学して軽くにちゃんまとめつくる

rspec でログインのテストで"Invalid Email or password" というエラーがでた

残念ながら Rspec でテストをするときはローカル上で手入力したデータは使えないようだ。自分で FactoryGirl などを用いて作成する必要がある。それをテストを実行する前に let で作成する必要もある。

さらに fill_in などで入力するデータは let で作ったインスタンスの値として user.email とやって取り出す必要があるのだ。 これをベタ打ちで “foo@bar.com” とやってしまうとなぜかエラーが出てしまいます。注意してください。

FactoryGirl.define do
  factory :user do
    name  "mori"
    sequence(:email){ |n| "foo#{n}@bar.com" }
    password              "password"
    password_confirmation "password"
  end
end
require 'rails_helper'

feature 'User manager' do
  
  let(:user){FactoryGirl.create(:user)}
 
  #ログイン
  scenario "log in" do
    visit root_path
    click_link 'ログイン'
    fill_in "Email", with: user.email
    fill_in "Password", with: user.password
    click_button "Log in"
    visit root_path
    expect(page).to have_content "ログアウト"
  end
end

jQuery でフォーム回りを指定するとき

ここでは jQuery を使ってフロントエンドでもフォームのバリデーションをしてやろうとうときに落ちいたミスを書く。

 

jQuery でフォームを指定するとき、2通りの方法がある。1つめはフォームの文字を指定するとき、2つめはフォームそのものを選択するときである。

1つめは「入力された文字が10文字以上のときエラーを表示する」というようなときに使う。

  var name = $(':text[name="user[name]"]');

こんな風に書く。また、そのフォームに入力されている文字を取得するときは text ではなく val を使う。だから今回は

name.val

というような書き方になる。

 

2つめは「フォームが blur になったとき if 文を発火させる」というときに使う。このときの指定の仕方は至極簡単。

$("#user_name") とやるだけでいい。

 

 

これらを合わせてコードにしたのが以下のものである。

 
<div class="field">
<label for="user_name">Name</label>
<span id="user_name_error">error</span>
<br>
<input id="user_name" name="user[name]" type="text">
</div>

 

<script>

$(function(){
  var name = $(':text[name="user[name]"]');
  var name_error = $("#user_name_error");
  //name.val("あああ")
  $("input#user_name").on('blur', function(){
    
    if (name.val() == "") {
      name_error.text("名前を入力してください");
      name_error.css("color", "blue");
    }else{
      name_error.text("ok").css("color", "red");
    }
  });
});

</script>

 

コムコム秋葉原店にいってきた感想

 

料金:○(9時間 1980円。自由に滞在し最安値になるように自動で選んでくれる)

広さ:△(リクライゼーション室の横幅がせまい。一畳の長さと考えればいい)

臭い:△(あんまりいいにおいはしなかった)

シャワー:有料(300円)

マンガ数: 25000冊

ドリンクバー:△(それほど種類が多いわけでもない。ただフローズンがある)

wifi: 有

アクセス:◎(秋葉原駅電気街口徒歩1分)

無料貸し出し:◎(ハサミやテープなどいろいろある。)

カード:強制的にかかされる(登録料 100円)

ドア:マグネット式

 

 

個室の広さは一畳くらいなので縦は問題にはならないが横幅はせまい。よこにカバンをおいて寝転がると狭まく感じる。あと個室の壁にペタペタお知らせ用紙がはってあるのでなんかごちゃごちゃした感じがして狭く感じる。

 

 

まあまあな場所。コムコム秋葉原店は高層ビルの 5~8階を占めている不思議な構造になっている。だからマンガはいろんな階に散在しているからお目当ての漫画にたどり着くのに時間がかかる。その分人も分散しているのでいびきかきやうるさい人に遭遇する確率も減る。

 

不思議なことに無料の貸し出しが充実している。事務用品が多く、ボールペン、メモ、のり、はさみ、カッター、クリップ、テープの貸し出しをしてくれる。それだけではなく高性能ヘッドホンも無料で貸し出ししてくれる。各フロアにはティッシュとウェットティッシュもおいてある。

 

ドリンクバーは充実してない。20数種類程度だ。あとわかめ味噌汁のみそもある。お湯をかければよかろう。お湯も無料で提供してくれているからカップラーメンをたべるときにも便利である。

 

トイレは各フロアに1つずつあり、自分ちにあるような狭いもので染みついた感じのくさい臭いがした。

 

 

メディアカフェポパイ渋谷プラス店に行ってみたので感想を書く

総合評価 70点

ざっくりまとめ

シャワーは有料、コンセント2口、wifi不明(あると書いてあるがなかった)、アダルト雑誌と DVD が充実、黒色、売店あり、

いいところ

  1. 部屋全体が黒で統一されていて落ち着く
  2. コーヒーが充実している
  3. アダルト系が充実している
  4. パソコンつかわなければ会員登録不要

わるいところ

  1. 部屋からでたときドアが閉まりきらないので不在がバレバレ
  2. シャワー別料金
  3. wifi がみつからない

 

 

部屋の中

 

f:id:mooooooooooriiiiii:20170603103812j:plain

 

f:id:mooooooooooriiiiii:20170603103851j:plain

 

スペースは広々しててよかった。身長 175cm くらいのボクが寝転がってもちょっと余るくらいの広さなので広い。横幅も漫画5冊分ある。横にカバンをおいても寝れるくらいの広さがある。

部屋は黒で統一されているので寝るときにおちついて寝ることができる。

 

f:id:mooooooooooriiiiii:20170603104149j:plain

 

ヘッドホンも部屋においてあるが、性能はいまいち。100均で買ったイヤホンのように「サー」という音がする。ないよりはましなレベル。

鍵はこういうスライド式のものでしっかりと閉まる。ただ残念なのが、部屋からでるときドアがちょっと開いたままになる。だから部屋の人が出ているかどうかまるわかりなので防犯上どうなのかと思う。

 

f:id:mooooooooooriiiiii:20170603104536j:plain

 

 

その代わりと言ってはなんだが 4桁のミニ金庫が各部屋に設置されている。ちょっと外出するときは財布や鍵はここにいれておいたらいいだろう。

 

f:id:mooooooooooriiiiii:20170603104719j:plain

 

 

あとなぜか知らないがテレビは DVD が見えない。だからエッチな DVD を見たいという人は会員登録してパソコンのある部屋を借りよう。

 

 

シャワールーム

料金は税込み 400 円で、リンスインシャンプー&ドライヤー&ボディソープ&洗顔剤が無料でついてくる。

f:id:mooooooooooriiiiii:20170603110248j:plain

ただしついてくるシャンプーなどはよくわからないが安そうな臭いがするので気になる人は持参するか、有料のいいシャンプーをかったらいいだろう。

 

バスタオルもついてこないので持参するか、 250円で購入する必要がある。ぼくは買ったのだがこれは買うのではなく、近くの100均で買うことを勧める。試供品レベルの質でとてもガザガザするのだ。

 

 

 

f:id:mooooooooooriiiiii:20170603110157j:plain

 

本題のシャワールームについて。まあ普通の場所。とくに臭いが気になるわけではないし、広さじたいも半畳くらいの大きさで、温度調節も自分でできる。とくに不満があるわけではない。

 

f:id:mooooooooooriiiiii:20170603110130j:plain

 

 

ドリンクバーについて

 

品ぞろえはまあまあいい。とくにコーヒーの品ぞろえは頑張っている。

uccドトール、AGF、ブレンディー、もひとつ何かが自販機で飲み放題だし、豆からはイタリアンブレド、カプチーノ、カフェラテをつくることができる。コカ・コーラやメロンソーダという定番のドリンクがない代わりに、コーヒーや冷凍ミカンジュースやマンゴージュースなどのコアなものが多い。

ボク的にドリンクバーは満点!!

 

f:id:mooooooooooriiiiii:20170603110746j:plain

 

f:id:mooooooooooriiiiii:20170603110747j:plain

f:id:mooooooooooriiiiii:20170603110752j:plain

 

 

マンガ・雑誌について

 

マンガはまあまあある。冊数はわからないが、壁にぎっしりあるのでたくさんあるのだろう。ただ難点はスライド式の本棚だということだ。本棚の裏にも本棚があるのだ。だから歩きながら見たい本を探すとき、見つからなければいちいち本棚をスライドして確認しなければならない。

こういうときのために、ポパイでは本の場所をネットで検索できるようになっている。

 

前にもいったがアダルト系がなぜか充実している。週刊雑誌、いわゆるエロ本、二次元のエロ本、アダルトビデオ、DMMのアダルトチャンネルなどめっちゃそろっている。こんだけあったらまあ自分の好みもみつかるだろう・・・

 

f:id:mooooooooooriiiiii:20170603114920j:plain

 

 

 女性向けの非エロ週刊雑誌も充実している。興味ないのでコメントはなし。

 

f:id:mooooooooooriiiiii:20170603115038j:plain

 

 

 

ジェイゾロフトを飲み始めて4日目。味覚が鈍くなったのと気分の落ち込みがある。

何を食べても飲んでも味がしない。舌全体に薄いガーゼが張ってあるみたいに味を感じずに素通りしていく。ジュースを飲んでも水みたい、チョコを食べても味がしない、カレーカップラーメンをたべても味がしない。いや、ちょっとオーバーだった。舌の奥と横のほうでは味を感じるのだが、それも薄い。味がほしい。

 

そういえばここ数日はグロテスクな動画ばかりを見ている。人が死ぬ瞬間や事故ではねられる瞬間などをユーチューブで見てる。全然興味なかった太平洋戦争について調べてたり、北朝鮮についてしらべたり、ヒトラーについて調べたりしている。

 

気分の落ち込みもある。一日中ベッドの上で寝ている。眠気もとれない。

 

とはいえ一日の中でも気分の落ち込みと上がりもある。ニュースをみたらこれ僕でもできそうと妄想をしたと思ったらその後死んだくなったり、元気が出てきてコンビニに言ったとたんにぐったりしたり。

 

 

rails のフォームで 「年と月」だけとか「年」だけの入力欄をつくる

data_select か datetime_select で日付を入力したいけど、何日とか時間がいらなくて、年と月だけで十分という場合がある。そういうとき、これらの XXXX_select のオプションに discard_day: true とつけてやるといい。

<%= form_for @user do |f| %>
  <%= f.date_select :date, discard_day %>
<% end %>

とするとうまく年と月だけが表示されたフォームができあがる。

f:id:mooooooooooriiiiii:20170515174831p:plain

上で作成した入力欄で、2017年3月として保存される値は “2017-03-01” となる。日にちは強制的に 1 日になるのだ。

ちなみに年だけがほしければ discard_month としてやればいい。すると

f:id:mooooooooooriiiiii:20170515175128p:plain

EverydayRailsRspec を読んだので Rspec をまとめてみた

TDD とは数学の証明問題で、答えをまず見て、答案用紙に途中式を書き込むイメージです。TDDをするときテストに書き込むのは結果(答え)です。アプリ開発においては望んでいる結果というのはすぐにイメージできます。 コントローラーのテスト

describe→describe→(context)→it

の順番で書くのだ。

モデルのテストのようにまず describe にコントローラーのクラス名を書き込む。

つぎに describe でメソッドとアクションを書き込む(GET #index, POST #create)。

インスタンスメソッドの検証やアクションのコードの中に条件分岐があるなら context で囲み、it で予想される結果を書く。基本的にこれを忠実に守っていくだけ。

describe, describe, context, it。

itに書く文章

GET の場合代入とページ移動の2つを書くのが基本

代入は

配列の場合 “populates an array of all モデル名の複数形 ”

文字の場合 “assigns the requested モデル名 to @変数名”

ページ移動は

renderの場合 “render the template :index”

redirectの場合 “redirects to template :index”

のようにかく

UPDATE や POST は context で条件分岐をする

正しい属性の場合 "with valid attributes"

間違った属性の場合 “with invalid attributes”

セーブ、更新するばあい "save(update) the (new) contact"

失敗したばあい “doesn’t save(update) the (new) contact”

it の中に書くこと

変数作成→移動→expect

が基本。

post

(有効な属性のとき)

it "saves the contact" do

attributes_for(:contact) の(:contact)とは何を表してるのか

これは FactoryGirl のなかのメソッドなのでファクトリーガールで作成したダミーデータを指している。だから (:contact)はファクトリーガールのテストデータのコードの中に

factory :contact do
 ○○○
end

というのがあるはず。それを指している。