Title only.

怖話Andyというユーザー名で登録しようとするとエラー。

Mysql2::Error - Duplicate entry 'Andy' for key 'index_users_on_name'

多分小文字のandyとぶつかってるんだろうな。

validates :name, uniqueness: trueしてるのに何故だろう。mysqlのcollationが変なのになってるのかなと確認してみるも問題無し。

uniquenessを確認している部分のSQLクエリをみてみると・・・

SELECT 1 AS one FROM `users` WHERE `users`.`name` = BINARY 'Andy' LIMIT 1

BINARY・・・だと・・・!?

deviseの設定でcase_insensitive_keysを設定しないとBINARYで確認しにいくようです。

# config/initializers/devise.rb:
config.case_insensitive_keys = [ :email, :name ]

ここにnameも追加してOK。configのコメントぐらいちゃんと読んどけってことですな。

starseeker

「usefulなライブラリを求めてるのにstarseekerを使ってない?」

「ふざけるな!」

「本日より貴様をスノーボール二等兵と呼ぶ」

「いい名前だろ、気に入ったか?」

成人男性の98%が利用してるというstarseeker.soに関して、残念ながら残りの2%に該当してしまった人(もしいるとすれば)にご説明させて頂きます。

starseekerとは

githubで自分がfollowしている人がstarを付けたrepositoryを毎朝メールしてくれるサービスです。

ただ僕はRSSもTwitterも見ない人のものは全く見ない代わりに見ると決めた人はひとつも漏らさず見るスタイル(情報収集スタイルについて - komagata)なので、starseekerもRSSフィードで見てます。

例えば、

moroさんがstarしてるreposは何か実用的でちょこっと便利なやつなんだろうなーとか

junoさんがstarしたのは、俺が知らないなんかおしゃれなgemとかなんだろう、とか

kenchanさんはすごくエッジなライブラリを見つけててすごいな、とか

全く知らなかったclojureを始めた時も、clojureの有名な人をfollowしとけばそこから直ぐに良い人が見つかって広がりました。

ビジネスマンが日経読んでないと上司に怒られる・・・みたいな。これが無い生活は考えられません。

あと、starseeker.so自体もruby2.0.0-p0, rails4beta1, pumaでソースがとても綺麗で参考になりました。

まあ、控えめに言って 神サービス ・・・ ですよね。

#263 Client Side Validations - RailsCasts

modelに定義したvalidationルールを使ってclient sideでもjsでvalidateしてくれるclient_side_validationsは糞便利なんですが、hiddenな要素はvalidateできない。

例えば、user_idがhiddenであって、特定のユーザーをブロックしたい時にはhidden要素もclient_side_validationsでvalidateしたい。

jsを2行書けば済むことなんですが、今後もありそうなのでgemにしました。

komagata/client_side_validations-with_hidden · GitHub
# Gemfile:
gem 'client_side_validations-with_hidden'
// app/assets/javascripts/application.js:
//= require rails.validations
//= require rails.validations.with_hidden

productionのデータ変更処理をmigrationに書くとrails_best_practicesに怒られる。

Rails Best Practices | Isolating Seed Data

怖話のコードで言えば下記の様なもの。

# encoding: utf-8                                                                        
class InsertSeedToSound < ActiveRecord::Migration
  def up
    Sound.create!(id: 1, name: "鳥の鳴き声")
    Sound.create!(id: 2, name: "犬の鳴き声")
    Sound.create!(id: 3, name: "水滴")
    Sound.create!(id: 4, name: "カエルの鳴き声")
    Sound.create!(id: 5, name: "ラジオのチューニング")
  end
    
  def down
    Sound.delete_all
  end
end

僕はmigrationに書いちゃってるけどみんなさんはどうやってますか?

seed.rbに書けっていうけどrake db:seedってリエントラントに書くもの?最初の一回だけじゃないの?

それとも、productionの状態に合わせて過去のmigrationをまとめてseed.rbをそれに合わせて書きなおすみたいなことするのかな?

ちょっと周りのrubyist2名ぐらいに聞いた感じ結論が出なかったので「ふつうこうだよ」っていうのを知ってる方がいたら教えていただけるとありがたいです!(@komagata

追記:

RailsでDBのデータ変更はどこにかく?〜真相編〜 - komagataのブログ

昨日Team Dashboardを設定して今日見てみたら…

もう、オマエら勝手に弄るなよなぁw

そもそもイントラ向けっぽいのでデータ変更系メソッドだけにBASIC認証かけときました。

# app/controllers/api/base_controller.rb: 
module Api
  class BaseController < ApplicationController
    http_basic_authenticate_with name: 'admin', password: 'foo', only: [:create, :update, :destroy]
    # some codes
  end
end

これでよし。

追記:


Created with Gifboom

弊社オフィスのダッシュボードは現Engine Yard@yandoさんから貰ったEeePCで動かしています。@yandoさんとても助かっています。ありがとうございます。みんなEngine Yard使おう!(東京リージョンもあるよ!)

ajaxで投稿してその結果を調べるみたいなテストでテストが通ったり通らなかったりする。投稿が反映される前に見に行くことがあるから。

feature "Posting a comment", js: true do
  scenario "as signed user" do
    comment_id = Comment.last.id + 1
    within("#new_comment") do
      fill_in 'comment[body]', with: 'コメントのテスト'
    end
    click_button '規約に同意してコメントする'
    sleep 1 # PLZ WAIT!! FIXME!!
    find("#comment_#{comment_id}").should have_content('コメントのテスト')
  end
end

CapybaraのREADMEにも書いてあるけどデフォルトは2秒待つようだけど5に変えたら行けた。(sleep 1は取りましたw)

# spec/spec_helper.rb:
RSpec.configure do |config| 
  Capybara.default_wait_time = 5
end

Facebook OAuthとかで証明書ちゃんと設定しないとSSLのエラーが出る。

SSL_connect returned=1 errno=0 state=SSLv3 read server certificate B: certificate verify failed (OpenSSL::SSL::SSLError)

certifiedがgemの中に証明書持ってるので使うと楽。

$ gem install certified

stevegraham/certified · GitHub

確かsignal vs noiseで見て最近ちょっと好きな書き方。

Foo.this_is_the_long_method \
  awesome_long_argument_name,
  fuckin_annoying_long_argument

キモいって人も多いかも。絶対80文字以内じゃなきゃ嫌だってわけじゃないけど、ブログに書く時やスマホで見易いので好き。

API側も自分で作ってる時など、webmockをrequireしてるのに「本当に大丈夫かな?」と実リクエストを飛ばしたい時があるので下記。

WebMock.allow_net_connect!

残したままpushすると大惨事になるので注意が要る。

webmockがmockしてくれない

「webmock使ってるのにresponse bodyが空で帰ってくる」

webmockを勝手にhttp proxy的に捉えてて「おかしいなあ」なんてハマってたんですがwebmockはhttpをmockしてるわけじゃなくて特定のclassをmockしてるだけなんですよね。考えてみれば当たり前なんですがREADMEにちゃんと対応してるライブラリが書いてある。

Supported HTTP libraries

  • Net::HTTP and libraries based on Net::HTTP (i.e RightHttpConnection, REST Client, HTTParty)
  • HTTPClient
  • Patron
  • EM-HTTP-Request
  • Curb (currently only Curb::Easy)
  • Typhoeus (currently only Typhoeus::Hydra)
  • Excon

parallel requestが簡単にできるtyphoeusのメソッドの中で、single requestをするpostメソッドとかを使ってたら常にresponse bodyが空。(何故parallel requestのためのライブラリでsingle requestを使ったのか小一時間問い詰めたい > 俺)

ちゃんとTyphoeus::Hydraしか対応してないって書いてありますね。RestClient.postにしたらあっさり動きました。

しかし、コジャレたライブラリにチャレンジしていく姿勢は失わず行きたい!