読者です 読者をやめる 読者になる 読者になる

リア充爆発日記

You don't even know what ria-ju really is.

Ruby on Rails

RailsでネストされたリレーションのN+1の解決方法

ranking.article.authorみたいなときの話。N+1はincludesつけて回避するのがふつう。 http://guides.rubyonrails.org/active_record_querying.html#eager-loading-associationsで、タイトルのケースも↑のリンクに書いてあるんだけど、こんな感じに書く。

RailsでCircleCIがMySQL5.6をサポートしていないので苦労した話

かつて日記に書いたんだけど、MySQL5.6から導入されたinnodbのfull text indexは割と便利。 http://d.hatena.ne.jp/ria10/20140107/1389071672が、innodbのfull-text indexを利用した機能があるRailsアプリをCircleCIでテストしようとすると絶対にコケる。 …

RailsのValidationで必要なエラーがだけを出すチョイワザ

こんなバリデーションを入れているとする。 validates :login_id, presence: true, uniqueness: { case_sensitive: false }, length: { in: MIN_LENGTH_LOGIN_ID..MAX_LENGTH_LOGIN_ID }, format: { with: /\A\w+\z/i } これだと、未入力でバリデーションに…

Railsでstructure.sqlがやたらコンフリクトするとき

config.active_record.schema_format = :sqlにしたとき、DBがMySQLだと(そうでない場合もなるかもだけど)db:migrate:resetしたりすると、dumpのタイミングでタイムスタンプがずれるのでこんな感じの残念な差分が生まれる。 /*!40101 SET COLLATION_CONNECT…

RailsでModelをDBから分割・整理する

それなりの規模のRailsプロジェクトではよくFat Model問題とかFat Controller問題が課題になってくる。で、Fat Model問題については、Concernsなどに振る舞いを切り出したり、そもそも「それって1つのテーブルに収める必要ある?」というものを分割するなど…

Railsでhttpsでアクセスしてもrequest.urlがhttpを返してきてしまう場合

ロードバランサーでSSL/TLSのデコードを行う場合、ブラウザのアドレスバー的にはhttpsでもアプリからみるとhttpなのでrequest.urlとかimage_urlとかがhttpで返してきて都合が悪かったりする場合の話。このあたりはRailsというかRackの処理になっていて、たぶ…

Capybaraで不定期にElementNotFound(特にCircleCIで)

何事もall or nothingにしたがる人は置いといて、ぼくはせっせと効果的な範囲でテストを書いていきたいと思っていますが、そんなぼくの心を知らずしてか、Capybaraは不定期に以下のようなエラーを吐く。何故か特にCircleCIで。 Capybara::ElementNotFound: U…

railsでhttpヘッダのを確認する

意外とゴリッと出すしかなかった。 request.headers.sort.map { |k, v| logger.warn "#{k}:#{v}" } ゴリっていう音がでるほどじゃないか。

active_decoratorとoctopusは相性が悪い

master-slaveの振り分けを行いたくてoctopusを導入した。 正直octopusはやりたいことに比べてtoo much感がプンプンしているんだけど、他のgemは導入に手間取ったのでoctopusにした。そしたら、あるとき undefined method to_a' for classOctopus::RelationPr…

Rails4でID以外をプライマリーキーにする

かっこつけて「なんでもIDついているのがレイルズウェイです!うぇーい!」とか言っているやつがいるんですよ〜。なぁーにぃ!?やっちまったな!!男はだまってid: false!! add_index!! def change create_table :foo_tables, id: false do |t| t.integer :…

RailsでSTIなfactoryの書き方

Vehicle Vehicle みたいな関連があるときのFactoryの書き方。こんな感じに書くとDRYだし、親モデルのテストにも使える。 FactoryGirl.define do factory :vehicle, class: 'Vehicle' do ~共通的な項目~ end factory :car, parent: :vehicle, class: 'Car' do…

Railsのenumをmodel横断的に使おうとしたときのメモ

複数のモデルにステータスなどの共通した値と処理を持たせたい!と思ってRails4.1のenumを使いつつ、concernなmoduleに切り出そうと思ったら、enumはActiveRecord所属だったので、困ってしまったときのメモ。しょうがないので、ActiveRecordを継承したクラス…

Railsで送信するメールのSubjectに一括で定型文を入れたいときのメモ

Webサービスから配信されるメールって最初にサービス名が入っているじゃないですか。 [HogeFuga] 会員登録のお知らせ みたいに。で、そのタイトルを毎回指定するのを忘れた、とか、忘れたわけじゃなくて、イチイチ入れるのってバカじゃないの?とかそういう…

rspecのcontrollerのテストでログインチェックのテストを共通化したメモ

ログインがあるアプリだと、各コントローラでログインしている場合はこう!ログインしてない場合はこう!というテストが書きたくなる。 具体的なテストコードはこんな感じでござる。 describe FoosController do let(:user) { FactoryGirl.create(:user) } d…

paperclipをAWSのS3+Cloudfrontで使うときの設定メモ

ワリと時間かかったのでメモ。config/environments/production.rb config.paperclip_defaults = { storage: :s3, s3_host_alias: 'your.cloudfront.net', path: '/:class/:attachment/:id/:style/:hash.:extension', url: ':s3_alias_url', s3_host_name: 's…

今使っている+今度使ってみたいGemリスト 2014年 夏 ver.

使っているやつ 使っているやつはGemfileを晒す。なお、複数プロジェクトのGemfileをマージしたものなので、全部同時に使ってるわけじゃない。 gem 'rails', '~> 4.1.4' gem "mysql2", "~> 0.3.16" gem 'bootstrap-sass', '~> 3.1.1.0' gem "sass-rails", gi…

capistrano3 + wheneverでハマったメモ

ハマった内容としては、deployしてもcronがupdateされないという現象。結論からいうと、サーバのroleの設定ミスだった。wheneverのcapistranoプラグインはデフォルトでdbロールのサーバに対してcrontabへのupdateを行うのだけれど、 対象のサーバがdbロール…

Railsでページビュー(PV)をとるならimpressionist

https://github.com/charlotte-ruby/impressionist「ブログ記事ごとのPVがとりたい!」がカンタンに実現できるgem。PV記録用のテーブルを別途作ってそこにアクセスを記録してくれる。とりまGemfileに設定追加してbundle installからのmigrateで。 Gemfile ge…

件数のキャッシュをcounter_cacheじゃなくてcounter_cultureで

Userに対するフォロワーの数とか、何かの投稿件数とか毎度調べてるとヤバイケースとかではcounter_cacheを使うと思うのだけれど、何かの投稿がステータスを持ってて、それがpublicなときだけカウントしたいときとか、counter_cacheが使えないので自分で実装…

Backbone.jsでClassをまたいだ共通処理を扱いたいときのメモ

twitterの「フォローする」ボタン的なものがあって、それはtwitterみたいに色んな画面(View)に登場する。 ボタンの動き自体は、1つのView(MyAPP.View.UserRelationButton)にまとまっているんだけど、こんな感じで、UserRelationButtonの初期化は、DOMから…

erbでclassなどを条件付きで指定したいとき

ループで回してたりして、ループが一定数超えたらどうにかしたい、みたいなときの話。 <% images.each_with_index do |image, i| %> <%= image_tag image.image.url(:thumb), class: "#{ 'hidden' if i > 3}" %> <% end -%> このように#{ }の中でifをつかっ…

Rails4.1にUpgradeしてRspecでMigrations are pendingと言われるようになったら

Rails4.0->Rails4.1にUpgradeしたのち、DBに修正いれてrake test:prepareしてrspec実行したら以下のエラーがでた。 /Users/ria10/IdeaProjects/ria10-web/vendor/bundle/ruby/2.1.0/gems/activerecord-4.1.0/lib/active_record/migration.rb:389:in `check_p…

viewで1行ごとに何かをはさみたいとき

in_groups_ofを使う。こんな感じ。 <div class="user-content"> <% @items.in_groups_of(3, false).each do |group| -%> <div class="user-content__row"> <% group.each do |item| -%> <%= render item %> <% end -%> </div> <% end -%> </div> 2番めの引数は、最後のループで1番目の引数で指定した数のアイテムがない場合、何を入…

railsのlink_to_ifにブロックを渡す

link_toにlink_to_ifはあるけど、これにブロックを渡す方法がない。ので、つくろうと思ったらもう作っている人がいた。 http://stackoverflow.com/questions/10305180/rails-how-can-i-show-a-block-with-or-without-a-link-based-on-a-condition-link丸パク…

ActiveDecoratorでhas_manyな関連モデルに対応する

ActiveDecoratorは今のところ、has_manyとかbelongs_toなモデルをdecorateしてくれない。PRが上がっているようだけど、これ2年前か。 https://github.com/amatsuda/active_decorator/pull/8githubの常識とかよくわからないんだけど、こんな感じでスルーされ…

rubyのstrftimeとかで0なしの月や日を表示する方法

マイナスを入れるだけ。 @user.birth_date.strftime("%Y年%-m月%-d日") マイナス思考から すぐに抜け出す9つの習慣作者: 古川武士出版社/メーカー: ディスカヴァー・トゥエンティワン発売日: 2012/11/14メディア: 単行本(ソフトカバー) クリック: 8回この…

unread gemとpublic_activity gemを組み合わせて使う

ハラが減ってるので、差分の作業だけメモっていく。unreadは既読、未読的なやつができる。 public_activityは「○○から☓☓にいいね!がありました」みたいなやつができる。この2つを組み合わせて、「○○から☓☓にいいね!がありました」が未読から既読にできる…

poltergeistでテストごとに設定を変更する方法

poltergeistはここにいろんな設定内容の説明が書いてある。 https://github.com/jonleighton/poltergeist#customizationで、今回js_errorsを一部のテストだけfalseにしたかったので、その方法を調べた。何かそれようのメソッドがある感じじゃなかったので、…

parallel_testsでRSpecのテストを高速化

テストが多くなってくると必然的に実行時間が長くなってしまう。 テストの書き方を工夫する余地があるうちはいいけど、それもきつくなってきたらもう後はマシンパワーに頼るしかない。そこでこちらのparallel_testsです。 https://github.com/grosser/parall…

動的にActiveRecordのプロパティにアクセスする方法

参考:http://www.davidverhasselt.com/set-attributes-in-activerecord/ふつう @user.name = "foo" とかやるところを、どういうわけかname1..name3くらいまであって、同じような処理をしたいときの話。 具体的にはバリデーションのテストだったんだけど。@u…

RailsとMySQL5.6.xで全文検索をやってみた

時間がないので備忘録的に書いていく。http://dev.mysql.com/doc/refman/5.6/en/fulltext-search.html 前提 全文検索には、Natural Language Full-Text SearchesとBoolean Full-Text Searchesがある。 日本語で前者を使うには、分かち書きを別途導入する必要…

Rails4のconcernsなmoduleのテストをrspecで書く方法

Railsとcapybaraで何かをドラッグアンドドロップしてソートするテストを書くではカテゴリをソートするfeaturesなテストを書いたけど、アレには当然modelのテストもある。モデルにはCategory.reorderという並び替えを行うメソッドがあって、これのテストはcat…

Railsとcapybaraで何かをドラッグアンドドロップしてソートするテストを書く

今回はカテゴリを画面でソートできることをテストする。たとえばブログで言えばブログカテゴリの表示順を管理画面でソートしたいとき、などの話。 こんな画面で、ドラッグアンドドロップでソート後、更新ボタンを押したら、その順番に更新される、という仕様…

RubyでEnumを使いたかったらenumerize

追記)この記事古いので、Rail4.1以上を使う場合は、ActiveRecord::Enum使ったほうがいいと思います。https://github.com/brainspec/enumerize結論からいうと、これはいいです。 例えば職業や性別なんかのDBで管理するほどのもんじゃないものはコレで扱うと…

Redmine2.4をインストールしようとしてMysql2::Error: Index column size too large

Redmine2.4をCentOS6.4+MySQL5.5にインストールしようとして、ひさしぶりに以下のエラーをみた。 Mysql2::Error: Index column size too large. The maximum column size is 767 bytes.: CREATE INDEX `wiki_pages_wiki_id_title` ON `wiki_pages` (`wiki_i…

Railsでバリデーション前に文字列の前後のスペースやタブを取り除くメモ

ベースにこれを使う。 https://github.com/holli/auto_strip_attributes gem "auto_strip_attributes", "~> 2.0" で、これだけだと全角スペースには対応してないけど、さいわい好きな処理を挟めるフィルター機能があるのでそれを使う。っていうか、これ使う…

RailsにJbuilderを導入したら、レスポンスが帰ってこなくって困ったでござるの巻

まず最初にJbuilderってJavaのなんかだと思った。富士通とかそういうところが出してるIDEとかなんかそういうの。10万くらいしそうな。で、そうじゃなくてレスポンスをjsonで組み立てるときに使うやつ。 https://github.com/rails/jbuilderWebAPIサーバなんか…

Railsでforce_sslしたらELBのヘルスチェックが通らなくて困ったときのメモ

いろいろ紆余曲折したけど、ELBからのリクエストヘッダにはHTTP_X_FORWARDED_FORがついているが、ヘルスチェックにはついてないので、これを利用する。environments/staging or production config.force_ssl = true config.ssl_options = { exclude: proc { …

Railsのmigrationで緯度経度をdecimalで設定する

http://guides.rubyonrails.org/migrations.html と http://dev.mysql.com/doc/refman/5.6/en/fixed-point-types.html と http://gis.stackexchange.com/questions/8650/how-to-measure-the-accuracy-of-latitude-and-longitude/8674#8674文系なんで、用語の…

RailsのDirtyはなぜDirtyというのか。

教えてください。http://api.rubyonrails.org/classes/ActiveModel/Dirty.html ActiveRecordの状態をトラッキングできる便利なモジュール。これを使うと、非公開から公開になったタイミングで公開日を入れる、的な処理がキレイに書ける。 before_save :publi…

Railsで管理用のアプリをnamespaceで同居させるときのメモ

やりたいこと 管理アプリもフロントアプリも同じプロジェクト内で共有するのがいいに決まってる。と思ってる とはいえフロントからアクセスされないようにネットワーク設定以外に、アプリ的にも対応しておきたい。 管理アプリは/adminというプレフィクスパス…

PaperClipでリサイズ指定

ありがたやありがたや・・・http://blog.rono23.org/12 '100' 横幅固定でリサイズ 'x100' 縦幅固定でリサイズ '300x200' 指定した値を最大値としてリサイズ '300x200^' 指定した値を最小値としてリサイズ '300x200>' 指定した値より、大きいときリサイズ '30…

strong parameterとaccepts_nested_attributes_forを併用する方法

こんな感じのとき class Parent < ActiveRecord::Base has_one :child accepts_nested_attributes_for :child こんな感じでやる params.require(:parent).permit( :name, :name_kana, child_attributes: [ :name, :name_kana, ] ) 福本作品もいいけど、甲斐…

Railsで検索フォームのバリデーションをかける

検索フォームの入力値もちゃんとバリデーションかけないと脆弱性のスクツになってしまいます。RailsCastにひとつの答えが載ってた。 http://railscasts.com/episodes/111-advanced-search-form-revised ※有料記事 かんたんにまとめると、検索をひとつのリソ…

RailsにJavaScriptのimage_path

erb以外でassets配下の画像を参照するとき、SASSにはimage-pathというナイスなヘルパーがあるのにJSにはない。困る。こういう誰でも困りそうなことは絶対誰かがなんとかしている。なんとかしていた。 http://dennisreimann.de/blog/referencing-rails-assets…

belongs_toでthrough的なことを実現する

例えば複数画像付き投稿ができる掲示板をイメージしたとき、スレッド→投稿→画像という多段構成のモデルができる。で、となりあう関係のモデル同士は、has_manyとbelongs_toで参照しあえるけど、スレッド→画像や画像→スレッドは一工夫する必要がある。スレッ…

Railsで開発してて"Resource interpreted as Font but transferred with MIME type font/woff"

http://stackoverflow.com/questions/12644391/rails-3-web-font-woff-mime-type Rackのmime typeのリストにないからということで、config/initializers/mime_types.rb Rack::Mime::MIME_TYPES['.woff'] = 'application/x-font-woff' これでサーバ再起動で消…

capistranoでdeploy:cleanがハングする

CentOS6.3で発症。パスワードを聞かれて入力したあと、タイムアウトするまでハングする。 https://github.com/capistrano/capistrano/issues/474capistrano-2.15.3/lib/capistrano/recipes/deploy.rb task :cleanup, :except => { :no_release => true } do …

RSpecのおともにdatabase_cleaner

何かの拍子にテストの一部が通らなくなった。コードを追ってみても原因がわからず、そこそこハマった結果、DBにゴミデータが残っていることが原因だとわかった。きっと実行の途中で止めちゃったりしたんだろう。 また同じようなことが起きたら、きっとこれを…

それでもFactoryGirl+RSpecが遅いと感じたら

Railsのrspecが遅いので対応した結果wwwwwwwwwwwwwwからしばらくして、やっぱり全体的にテストが遅い・・・!と再認識し、コードを書くのにストレスを感じてきたから本腰入れて調べてみることにした。で、結果がしょぼかったから経緯は省いて…