SakuraWi - BLog

WEBエンジニア。聴いたお話をまとめておく倉庫的な。スタックストックスタック!

NoMethodError: undefined method `use_transactional_fixtures=' forのエラー処理【Ruby on Rails】

Ruby on Railsで、RSpec導入にあたって、
NoMethodError: undefined method use_transactional_fixtures=' for
や、
bundler: failed to load command: rspec
もしくは
bundler: failed to load command: rspec NameError: uninitialized constant FactoryGirl
と出た時のエラー処理についての記事です。

対処方法

まずは以下のコードが書かれているか、チェックしてみてください。

spec/rails_helper.rbに コードを追加する。

  • require 'factory_girl_rails'を追加。

  • config.include FactoryGirl::Syntax::Methodsを追加。

以下コード例

ENV["RAILS_ENV"] ||= 'test'
require 'spec_helper'
require File.expand_path("../../config/environment", __FILE__)
require 'rspec/rails'
require 'factory_girl_rails'

---
省略
---
RSpec.configure do |config|
  # Remove this line if you're not using ActiveRecord or ActiveRecord fixtures
  config.fixture_path = "#{::Rails.root}/spec/fixtures"
  config.include FactoryGirl::Syntax::Methods

---
省略

こちらを加えると解決できるはずです。

エラーが修正されない場合

gem fileの gem 'rspec'のバージョンをチェックする。 自分の場合は、RSpecの入門として、こちらの記事を参考にしてました。
RSpecの入門とその一歩先へ ~RSpec 3バージョン~ - Qiita

この影響で、 Gemfileを

+source 'https://rubygems.org'
+
+gem 'rspec', '3.0.0'

としており、rspecの 3.0.0 がinstallされていました。
こちらを修正するとFactoryGirlとのバージョンが合うみたいで、エラー解決になりました。

その他、参考にされているページ

コンビニトラップとCASHな1日

今日はCASHについて話すことが多い1日だった。

CASHについて

数字の記事
質屋アプリCASHが査定停止、開始16時間で3.6億円以上のアイテムをキャッシュ化ーー集荷依頼アイテム数は7500個に - THE BRIDGE(ザ・ブリッジ)

おそらく、2万円ずつチートとかで儲ける人がいたとしても、2万円だけでブラックリストいき、もしくは通常通りに15%返済してくれる人がおおければそれで成り立つ、というような構造にしている気もする。
のと、それで利益がでると踏んでスタートしていそう。
でも、初日の反動が強すぎて現金が足りなくなっているのかな。

集荷関係のところで、ものを送ってそれの判断とかどうやってるんだろう。
そのまま送らない人から、どうやって請求するんだろう?


ひとまず、16時間以内の使用体験が持ててよかった。
怪しいだのなんだのいろいろあるけど使ってみないとわからない感覚はあるはず。
メルカリみたいに、これでも売れるのかよ!すっげーな!っていう。

結構いろんな記事が出回っていて、読むだけでおもしろい。
【インタビュー】「モノを瞬時に現金化」新サービスCASHの仕組みは?光本代表に聞く - 2ページ目 | Fashionsnap.com

コンビニにて

LAWSONでホットドッグのようなものを買うと
店員さんが「レンジ2番で温めてくださいー」

レンジに入れて2番をおしてちょっとまってると
ぼん!

袋あいてもうていた。。。
2番いうたやん、、、

テストが大事な理由

TDD では、実装の前にテストを書きます。これは、半ば強制的に「利用者の視点」を得ることが出来る、という効果を持ちます。まだ実装されていない機能のテストなのですから「自分はこういうメソッドがわかりやすい」「こういう名前が良い」、逆に「こういう名前は曖昧で不安」「引数が文字列5つとかありえない」などのコードを利用する側としての視点や感情を得られます。
TDD では、その感情や利用者としての設計判断をテストコードという形で記し、その後で実装を行うことで、既存の実装に引きずられにくい「こうしたい」「こうあるべき」という実装を引き出しやすくなるという効果があります。
「自分が書くコードの最初の利用者は自分」というのが TDD のルールです。英語では「 Eat your own dog food (自分のドッグフードを食べろ)」というフレーズで知られている考え方でもあります。

この記事がおもしろく、勉強になる

全部わかるようになりたい。
git誕生の小話がかなり面白い

https://recruit-tech.co.jp/blog/2017/06/07/bootcamp2017/
こんなにすごい資料を無料で誰でも読めるように公開しているあたり、かっこいい。

CASHがすごい衝撃をもたらした

築地No.1イタリアンに近い会社で働いています、櫻井広大です。

ブログ

なんで書いてるのか?
いつ書いてるのか?

とかちょいちょい聞かれるが、あまりうまく答えられていない。

書く理由は自己発信のため?
いろんな機会が増えると思っているし、アウトプットの仕組みかつインプットの仕組みだから。
書くのが結構好きだし

書いてるのは寝る前に30分くらいかけたり。

日中になんか感じたことを少しメモしておいて後から肉付けするというスタイル。

楽しむ心

なにごとも楽しもう!という意気込みが大切だ、と思った。

なんだか最近は追われているかのように学習していたため。
もっと楽しく学ぶべきだ。
あせっちゃいけない。パニックゾーンに入ってはいけない。
ストレッチゾーンでのびのびやるのがいい。

継続させるためにも。

写真を撮るというスキル

コミュニケーションの1つである。

撮る方に余裕がないと難しい。
笑顔の引き出し方。

昔にも記事かいてたような
これか

カメラを通して考える結果の残し方 - SakuraWi - BLog

ニフティ

お世話になったニフティ株式会社さんに関する記事がhatenaTOPによく出ている。

デイリーポータルZ(@ニフティ)に行ってきた!:ヘボコン制作「前」記 - ペンとサイコロ -pen and dice- BLOG

CASH payday

金融?というかお金関係のサービスすごいな
物売りまくれるやーんって安直に感じていたら使っているとちょっと違うものだと気がついた。
触ればなんとなく気がつく人も多いのでは

追記 ついに資金切れ?のようで、査定が止まりました。 3.6億円の出金があったようです。 数字についてはこっちに書いています。

会社でもcashについての話題で話すことが多いです。 僕はTシャツなどを売って、6000円ほどのキャッシュにしました。 はたして集荷はどうなっているのか?現金化できるのか? 会社はどうなるのか、などなど体験、体感していこうと思います。 blogでどうなっていくか、どうだったかも書きます。

質屋アプリCASHが査定停止、開始16時間で3.6億円以上のアイテムをキャッシュ化ーー集荷依頼アイテム数は7500個に - THE BRIDGE(ザ・ブリッジ)

paydayもすごそう。 Payday|毎日をお給料日に!

読んだ記事

笑ってまう

ハンターハンターの最新刊を読むことは、出来ない - もはや日記とかそういう次元ではない

CASHの実態にせまる。本質的なものはこっちだな

“質草”の写真を撮れば審査なしで資金提供——STORES.jp創業者の新レンディングサービス「CASH」 | TechCrunch Japan

謎の起伏

ここ2日間くらい沈み気味だったが、今日は元気だった。
進んでいるんだと脳みそに感じさせるのも大事だなぁ。

markdown形式をわすれてしまって改行が読みにくい時が、、、

寝坊体験

今日は初めて朝寝坊のような体験をしました。

いつも起きる時間は7:20くらいで、目をさますと8時でした。。。
会社には1時間前くらいに通勤しているので助かりましたが、かなり焦りました。

きちんと睡眠をとりましょう。

ハッシュについて

ハッシュロケットについての記事を書きました。

【Ruby / RubyonRails】ロケットハッシュの書き方は古い?シンボルの書き方をしよう - SakuraWi - BLog

1日が早い

最近特に、1週間、1日の流れを早く感じます。 タスクとしてやりたいことは、時間を決めてこの時間はコレをすると決めないと1日が終わってしまってます。

今は本を読みたいし、漫画読みたいし、開発したいし、記事書きたいし、という感じで脳みそがんばってくれって感じです。

習慣化の力を借りてどんどん前へ進んでいく感覚を得たいですね。

【Ruby / RubyonRails】ロケットハッシュの書き方は古い?シンボルの書き方をしよう

RubyやRuby on Railsを勉強していると必ず出会うであろう、ロケットハッシュについて書こうと思います。

三( ε:)

_(┐「ε:)_

僕のハッシュロケットのイメージは上記の通りです。

ロケットハッシュって名前がかわいいですね。

ロケットハッシュとは

こいつです。 :name => "rocket" ハッシュのキーと中身についてを書くための記述方法ですね。

かわいいこいつですが、どうももう時代遅れになり掛けているようなのです。 ということで、新しい書き方をこころがけましょう。

今風のハッシュ

name: "rocket" こんな感じで書きますね。 シンボルというものを利用して記述します。

method: :getなんて書いちゃうこともあります。

余談

これまでのハッシュ。こんなのもありました。 "first_name" => "Kota"

USキーボードでも、JISキーボードでも =>はタイピングしにくいように感じます。

ひたすら水のんでひたすらトイレ

最近ちょいと毎日かけていないなと。

なぜ毎日描こうと思ったのか? 毎日かく目的は?

目的はなんだったかな、と原点に帰らないとと思った。

なぜ、櫻井広大は毎日ブログを書くのか? - SakuraWi - BLog

そしたらなんかこんなの書いていて、みてみたけどあんまりうーん?って感じだった。笑
でも大きいのは情報発信かな?それと習慣化とか整理っていう部分が強いかな。
あとは一年続けた先になにがあるだろう?という好奇心的なところ。

技術的なものも書き始めました。

ぶっちゃけ、レベルが低いですが、誰か同じレベル帯の人がみてもらえたりして参考になったらいいなと。

逆に、自分レベルだとqiitaなどをみても何をいったんだ?となることが多いため、細かい疑問に思うところとかどうしたらいいのかを説明していく感じで書きたい。

そして書いていて思ったけど、めっちゃ時間かかるし超難しい

相手に伝わる書き方がとことん必要だ・・・。

なにからなにまで書いてたらめっちゃ長くなるし省くとわからない人にはわからなくなるし・・・。

というか、自分自身の理解が浅いから深くまで書けないよーっていうのもある。 うーん、qiitaや技術ブログでわかりやすく書いている人ってほんとに偉大だなぁ。

検索フォームにvalidationを追加する方法【Ruby on Rails】 - SakuraWi - BLog

code部分のハイライトがいまいちなので、このブログもテーマ変えるか、cssで調整しないとな。

ハクソーリッジみた

アメイジングなスパイダーマンしていた俳優が主演。

衛生兵に志願し、多くの命を救った兵士のお話。 舞台がまさかの。

戦闘シーンは見入ってしまう。
プライベートライアンと比べられていたが、たしかに劣らないくらいかも(昔にみたから記憶があいまいだけど)

結構グロいシーンもあり、しっかりみたい人と行くべきかも。

Markdownみにくい

markdown形式にしたけど改行が変な感じだ。。。
と思ったらスペース2個行末ね。

毎日丁寧に生きる

コーディングもだけど、雑だ。 自分雑な性格だなぁ。

今が本番で、全部本番だからちゃんとしっかり丁寧にしなければ!!! 後からやろう、をなくしていこう。

検索フォームにvalidationを追加する方法【Ruby on Rails】

Ruby on Railsにて、検索フォームを使用した際に、受け渡す値にvalidationを加えたい時、ありますよね。
form_forやform_tagを使用した際のクエリ,パラメータにvalidationを加える方法を書きます。

Formオブジェクトというデザインパターンのひとつです。

RailsTutorialを絶賛挑戦中や、終わってから少し応用的なことをしている人は同じようなことで困っているかと思います。
参考にになれば幸いです!

おおまかな流れ

  1. modelによるvalidationを利用するため、フォーム用のクラスを作成する。
  2. クラスにvalidationを記述しておく
  3. コントローラ内で作ったクラスをインスタンス化させる時に引数として渡してvalidationを適用させる

といった流れですね。

内容

主に検索フォームを使用した例はこちら

RailsTutorial7章より

<%= form_for(@user) do |f| %>
      <%= f.label :name %>
      <%= f.text_field :name %>

      <%= f.label :email %>
      <%= f.email_field :email %>

      <%= f.label :password %>
      <%= f.password_field :password %>

      <%= f.label :password_confirmation, "Confirmation" %>
      <%= f.password_field :password_confirmation %>

      <%= f.submit "Create my account", class: "btn btn-primary" %>
    <% end %>

このコードでは、以下のコントローラで定めたUserのモデルオブジェクトを使用したformを作成しています。
つまり、@userに対して働きかけが行うようにしているといったものです。
@userはmodelであるUserからインスタンス化したものです。

class UsersController < ApplicationController

  def show
    @user = User.find(params[:id])
  end

  def new
    @user = User.new
  end
end

ここで、validationがかかるタイミングはmodelを作成しようとした時です。
上記のmodelのUserをみてみましょう。

class User < ActiveRecord::Base
  validates :name, presence: true
end

こちらのUserは ActiveRecordを継承して作成しています。
ここがポイントです。
ActiveRecordを継承して作成したmodelオブジェクトは、簡単に言えばDBとやりとりを行うmodelとなります。

modelでは、createやnewを行うタイミングでvalidationが適用されます。
ここでは,validates :name, presence: trueの部分ですね。
name属性(変数)は、空はだめですよ、といっています。

さて、modelオブジェクトを使えばvalidationをさせる仕組みは揃っているということです。
こちらを利用します。

ただし、今回のparams[:keyword]のような一時的な値の受け渡しにおいていちいちDBに保存していると時間がかかってダメです。
そこで、一時的に格納するオブジェクトを作成することで解決させます。

以下のようなclassを新たに
app/models/の中に作成します。
クラスの名前、attr_accessorの変数名は各自で設定してください。
クラスにおける変数としてattr_accessorで定義します。

class SearchForm 
  include ActiveModel::Model

  attr_accessor :keyword
  validates :keyword, presence: true
end

validates :keyword, presence: trueの部分はvalidates :keyword, presence: true, length: { maximum: 10 }のようにvalidationを追加してもよいでしょう。

ここでポイントは2点です。

  • class に < ActiveRecordがないこと
  • include ActiveModel::Model

ActiveRecordを継承しないのは、DBとやりとりをしないclassであるととらえておいて問題なさそうです。
include ActiveModel::Modelについても、このように記述すると思っておきましょう。
詳しくは追加でググりましょう。

さて、これでmodelを用意することができました。
あとはこちらのクラスを使ってインスタンス化を行えば自動的にvalidationがされるはずです。

コントローラ内にてこんな感じになると思います。
SearchFormのクラスは作ってあるため、コントローラで使えます。

word = SearchForm.new(keyword: params[:search_keyword])

newしてあげる時にparamsで値をkeywordに入れてあげましょう。
この時にvalidationが行われます。

ここで一度、rails consoleを用いてvalidationに応じていろいろと値を入れてみて試すとvalidationが行われているか確かめることができます。

>word = SerchForm.new ( keyword: "aaaaaaa")
>word.valid?

長さのvalidationをかけているならこんな感じですね。

>word = SerchForm.new ( keyword: "")

空白をチェックするならこんな感じ。

と、これでvalidationが適用されることになったので、あとはインスタンス変数の(この場合は)wordを使いましょう。
params[:keyword]としていたところをwordを使ってあげるとOKです。

参考記事

form objectを使ってみよう - メドピア開発者ブログ