Rails

ネームスペース付きのモデルをfixutureで読み込ませる

Rails4.1.4 FactoryGirlはテストデータを作成するコストは低いけど実行時が超遅い。 なので最近は、読み込みだけのテストならfixtureを使う派になってきていまぁす。本題。 特定のタグが付いているレコードを返すモデルのテストを書いてて、 その特定のタグ…

remove_indexでnameオプションが無視される

https://github.com/mbleigh/acts-as-taggable-onacts-as-taggable-onで使うテーブル名に、プレフィックを付けてmigrate:redoやったらdownの時にエラーになった。 Index name 'index_momiji_taggings_on_taggable_id_and_taggable_type_and_context' on tabl…

PolymorphicなTableに無関係なモデルからhas_one Associationを定義する

analysesテーブルにanalyzable_idとanalyzable_typeという項目があって、 analyzable_typeには、'Event'と'Spot'という値が入っている。 hasする側からは↓と定義すれば、@event.analysisというふうに呼べる。 class Event < ActiveRecord::Base has_one :ana…

gemでよくある設定内容を上書きする書き方

[14] pry(main)> RUBY_VERSION => "2.1.0" module Rspec def self.configure(&block) yield(config) end def self.config @config ||= Config.new end class Config attr_accessor :verstion, :unko def initialize @verstion = '2' @unko = 'yamada' end en…

capistrano2を3にした

rails (4.1.2) capistrano (3.2.1) capistrano-bundler (1.1.2) capistrano-rails (1.1.1) capistrano-rvm (0.1.1)cap2とcap3でデプロイコマンドは若干違ってる。(3は:migrationsがいらない。) 今自分は2と3を使っているプロジェクトをそれぞれやっており、 …

開発初期はdatabase dropとcreateしてデータベースを変更しがちだけどオーバーヘッドが大きい

本番リリースする前のアプリを開発していて、カラム追加とか変更をしたくなった時 (カラム変更するマイグレーションファイルをジェネレイトしないで) create_tableを書いてるマイグレーションファイルを直に修正して $ rake db:drop; rake db:create; rake d…

グラフのX軸で使う感じの連続した日付の配列を返す

Rails4.1Date#beginning_of_monthはactive_sucpportとのこと。 [140] pry(main)> (Date.new(2011, 1, 1)..Date.new(2013, 1,1)).map(&:beginning_of_month).uniq.map{ |x| x.to_s.match(%r!\d{4}-\d{2}!).to_s } => ["2011-01", "2011-02", "2011-03", "2011…

金額入力フィールドにカンマを自動挿入する

https://github.com/randoum/autonumeric-rails キー入力毎にカンマ入れてくれるやつ。サーバに送信する時はカンマ抜いてくれてるっぽい。 Gemfile gem 'autonumeric-rails' js //= require jquery //= require autonumeric View <%= f.text_field :field, d…

Arelデビュー

Rails4.1ArelはActiveRecordは中で使ってるライブラリ。詳しくはしらん。 ActiveRecord使ってるのになんで内部のライブラリを使わないといかんのかとか今まで必要になったことがなかったので使ってなかったけど今回は条件をorで繋げたくなったので仕方なく使…

(active_adminで)strong_paramsに*User.column_namesを使ってエラー

active_adminデビューしました。 rails4からマスアサインメント脆弱性の対策である、strong_paramsがデフォで入ってます。 なので、controller周りを使うライブラリ(deviseとかactive_adminとか)には、どの項目をブロックするのか通すのかを明示しなくていけ…

acts-as-taggable-onでタグが登録されていないレコードを返す

acts-as-taggable-on (3.2.2) rails (4.1.1) Word.where.not(id: Word.joins(:taggings).uniq)

geokit-railsを使って距離で絞りながら距離でソートする

緯度経度から距離を計算するgeokit-railsの使い方rails (4.1.0) geokit-rails (2.0.1)withinメソッドを使えば距離で絞れるけど距離で並ばない。 by_distanceメソッドを使えば近い順になるけど距離で絞れない。 みたいになってハマってた。geokit-railsのREAD…

development環境でAssetsPrecompileを有効にすると捗る

rails (4.1.0) 最近のマイブームはdevelopment.logをtailで垂れ流しながらコード書くこと。 こっそりwaningとか意図通りにパラメータが渡っているのかとかすぐ確認できるので結構便利。デフォの設定をだと、development.logにはjQuery周りの配信でログが汚れ…

インテグレーションテストをすこし早くする

環境 rack-test (0.6.2) poltergeist (1.5.0) テスト遅いのなんとかしたくて試験毎に呼ばれるログイン処理なんとかならんかみたいの考えた結果、ドライバーのAPIを直接叩くようにしてみた。ちなみに、ログイン処理はspec_helper.rbに書いてどのテストからで…

scss-lint入れたほうがいい

scss-lintは、CSS拡張メタ言語「SCSS」のRuby製静的解析ツール。RuboCop的なやつ。 https://github.com/causes/scss-lintプログラマはFatなソースコードと闘い、日々テストコードを書いているけど、 CSSってテストする文化ないので、どうして付け焼刃みたい…

Rspecの結果を通知センターに表示する

https://github.com/twe4ked/rspec-ncMacの通知センターにrspecの結果を表示するgemだよ。 テスト中はTwitterとか別のことをやりだすマンなのでテスト終ったのがわかるととても助かる。 導入もすごく簡単でGemfileにgemを追加と.rspecに追記するだけ。 Gemfi…

featureスペックで確認ダイアログをクリックしたい

capybara (2.2.1) poltergeist (1.5.0) rails (4.1.1)link_toヘルパーにカスタムdata属性confirmを書くとjsの確認ダイアログを生成してくれる。 <%= link_to icon("trash"), admin_book_path(book), method: :delete, data: { confirm: "『#{book.name}』を…

specをすべて流したら落ちるテストがあってつらい

全spec流さないと再現しない。 feature_specだと、画面ベースでのエラー内容なのでピンと来ないことがけっこうある。 Capybara::ElementNotFound: Unable to find file field "event_photo[image]"よく落ちる行の例外を補足した時binding.pryを走るようにす…

try

tryメソッドはactive_supportに入ってる超便利メソッドな訳だけど引数をtypoしてもnilが返ってくるので結構あぶない! テスト書いてtypo回避したほうがいいよ!と書こうとしたんだけど、 ググるとtry!というメソッドがあって、nil以外のレシーバでundefined…

activation_tokenが設定されない場合がある

sorcery (0.8.2)Railsで認証系ライブラリといえば、Deviseだけど自分は微妙な印象。 Deviseってやっぱ何やってるかよくわからんしviewのgenerateしたところでカスタマイズするのすごくしんどい感じがあるし、 railsのgeneratorが既に充実しているので他のラ…

コントローラーのindexアクションのテスト

ArticlesController < ActionController::Base def index @articles = Article.all end end describe ArticlesController do describe "GET 'index'" before { get :index } it { expect(assgins(:articles)).to Article.all } end end end テストが少ないう…

futureスペックのjs: trueなテストが動かない時 解決編

Rails4.1アップデートの過程でjs: trueなテストがこけるようになっていた原因がわかった。js: trueのテストの時、usersテーブルに入っているはずのレコードが空になっていて、ログインできずに目的の要素を発見できずにビジーループからのタイムアウトが起き…

rails4.1のdefalut_scope

仕様が変わり、default_scopeの内容が上書きされずにチェインされるようになった。 4.1より前 class User < ActiveRecord::Base default_scope { where state: 'pending' } scope :active, -> { where state: 'active' } scope :inactive, -> { where state:…

futureスペックのjs: trueなテストが動かない時

みんな大好きpoltergeistを使ってる。Rails4.1アップデートの過程でjs: trueなテストがこけて困ってたんだけどドライバのログを出すようにしたらなんかわかりそうな気がしてきた。 # spec/spec_helper.rb Capybara.register_driver :poltergeist do |app| op…

rails4.1

http://edgeguides.rubyonrails.org/4_1_release_notes.html 4.1からspringが最初から入ってるよ。 ターボリンクもそうだけどなんでもかんでもデフォになっていってバージョンアップのたびに敷居が高くなっている。やばい。

delegate

delegateは委譲という意味で横流しにするイメージ。 やっていることはラッパーの自動生成な感じ。 class Greeter < ActiveRecord::Base def hello 'hello' end def goodbye 'goodbye' end end class Foo < ActiveRecord::Base belongs_to :greeter delegate …

Rails開発すると避けられないこと

git blame

scopeの粒度について

このscopeはRelationオブジェクトを返すほう。scopeに定義している内容は短いほうがよい。orderオプションだけとか、whereオプションだけとか。 そのほうがアクション内に書いてるscopeチェインで処理内容が把握できる。Modelの定義を見に行かなくていいよい…

バリデーションで使うテキストファイルを読むとき

class User @@easy_passwords = File.read("#{Rails.root}/lib/data/easy_passwords.txt").read end てきな感じ。 クラスコンテキストで実行するとクラスロードの時に実行されるのでファイルオープンは1度だけ。 ほぼメンテしないしテキストファイルサイズが…

Railsでこういうのきらい

TopController < ApplicationController before_action :set_item, excect: %w[new edit] ....... def set_item ..... end end onlyつかって欲しい。 新しくactionを追加したらこのbefore_actionに含まれるし、これを継承してたらさらにしんどい。 記述量でe…