破いて捨てたノート

Webやテクノロジーやそれ以外に関する思いつき

Rails

Controller concerns のテストをRSpecで書く - Rails, Rspec Rails 3.*

Anonymous Controllerを使えばこんな感じで書けるっぽいのでメモ。 # app/controllers/concerns/foo.rb module Foo extend ActiveSupport::Concern # logic end # spec/controllers/concerns/foo_spec.rb require 'rails_helper' Rspec.describe Foo do cont…

表参道.rb #1 を開催しました

主催者の一人として 表参道.rb #1 を開催しました。 50名近い規模のイベント主催は初めてですし、ましてや Rubyコミュニティ なんて畏れ多い。とにかく不安だらけでしたが、たくさんの方にお集まりいただいて、安堵しています。LTもおもしろい内容のものが多…

Rails + React + ES6 のためのアセット環境構築

結論 Sprocketsの動作を維持しつつ、npmやgulpなどのモダンなパワーも取り入れた、いいとこどりな環境を構築してみた。 やりたいこと SEOのため、Reactでserver-side renderingをしたい JSコードをES6で記述したい 既存のCoffeeScriptのコードも共存させたい…

ES6を導入したいRailsエンジニアの覚書き

選定候補 CoffeeScript 現状使用している Railsとの相性がよい(デフォルトでサポートされている) ECMAScript 6(以下、ES6) 次期JavaScriptの標準仕様 ES6はいつ勧告されるの? 2015年6月予定 つまり、仕様はまだ固まっていない(が、ほぼほぼ固まってい…

Reactを導入したいRailsエンジニアの覚書き

各フレームワークの特徴(つらみ)を整理 only jQuery Viewが状態を持ってしまう拡張やテストがしづらい DOMを指定してViewの更新処理を書くのはつらい Backbone.js Viewの更新処理を手動で書かないといけないのはつらい ModelとView間のイベント管理が煩雑…

Railsに初コントリビュート決めた

これまでRailsに何度かPull Requestを投げてはRejectされを繰り返していたが、この度、初めてcommitをmergeして頂けた。documentationの大したことないcommitだけど嬉しい。 Rails Contributors - #2125 yachibit - All time Rails Contributors - #2125 yac…

Rails の`datetime_select`でつくるセレクトボックスを「年」「月」「日」「時」「分」で区切る

日付に関するセレクトボックスを「年」「月」「日」のように日本語で区切りたいことってよくありますよね。 dateに関するセレクトボックスに関しては、 id:inouetakuya さんの「Rails の date_select でつくるセレクトボックスを「年」「月」「日」で区切る…

Rails で`find_by_id`に渡す引数はString でもいけるんだって

# 普通のやつ User.find_by_id 1 => #<User id: 1, name: "yachibit", ...> # Stringを引数に渡すと... User.find_by_id '1' => #<User id: 1, name: "yachibit", ...> # このへんも同じく User.find '1' => #<User id: 1, name: "yachibit", ...> SUGEEE!! つい最近知りました。 よくよく考えたらいつも使わせて頂いてたわけなんですが... パラメーターで渡ってくる値は</user></user></user>…

RubyでHTTPリクエストを投げて返ってくるJSONをParseするとかいうよくあるやつ with Net::HTTP, open-uri

タイトル長えw さて、HTTP リクエストするとJSON が返ってくるようなAPI でなんやかんや処理をすることが割りとよくあるのだが、すぐに忘れてしまうのでメモメモ。 https://api.example.com/smaple.json にHTTP GET リクエストを投げるとJSON が返ってくる場…

.irbrcを使って、irb起動時によく使用するコードをメソッド化する

意外と知られていないようですが、irb コマンドは起動時に.irbrc というファイルを読み込みます(*1)。ここに様々な設定やメソッドを書くことができます。 例えば、自分はrails consoleでよく irb(main):001:0> User.find_by_user_name 'yachibit' というコー…

Railsでブラウザ上のエラー表示をdevelopmentとproductionで同じにする

Railsのconfigにはconsider_all_requests_localという設定項目があって、こいつをtrueにすると、すべてのエラーをブラウザに表示をするかことがでいる。逆に、falseに設定すると、ブラウザには詳細情報が表示されない。 デフォルトでは、 development環境はt…

Railsで1つのviewに複数のURLを与えるrouting

先日、少し特殊なルーティングを実装した。 viewとしては普通のnewフォームなのでURL的には/counselings/newとするのが普通なのだが、以下の理由から/counselingsというURLでもnewをrenderするようにしたいとの要望がきた。 メール等にも記載するURLなのでな…

pluckがmapより速いからと言って、いつでも使って良いわけではないそうです

Rails3.2から導入されたpluckメソッドのパフォーマンスが素晴らしい件 こちらの記事にも代表されるように、 User.map(&:id)と書くよりUser.pluck(:id)と書いたほうが方がパフォーマンスは速いと言われている。(実際速い ただ、APIをみるとpluckはArrayを返…

validationに`:if` optionを渡すと、viewの`requuired: true`が自動でつかなくなる?

Railsのmodelでpresence validationを書いて、 # model validates :username, presence: true そのattributeに対応するformの入力欄をこんな風に書くと # view - form_for @user = f.text_field :username だいたいこんなようなHTMLが生成される。 <input id="user_username" name="user[username]" required="required" size="30" type="text" /> validati…

列挙型の値を保存するときはintegerで保存しとけActiveRecord::Enum

列挙型とは、有限集合として持つ抽象データのことで例えばstatusなんかがそうです。 stasus: [:active, :archived] みたいなやつ。 例えば、Conversationクラスにstatusカラム(active, archived)を持っている場合を考えてみましょう。 主な保存方法として…

Rubyの`Enumerable#each_with_object`を使ってみた

attr_accessorで生やしたattributes達とそのvaluesをハッシュとして欲しいことがあり、最初はこんな感じに書いた。 hoge_attributes = {} %I(user_name first_name last_name email).each do |attr| hoge_attributes[attr] = @hoge.send(attr) end 次の日に…

【MySQL】MySQLはtrailing spaceを無視する【クソ仕様】

まずはこのコードを見てください。 User.where(user_name: 'yachibit ') User Load (0.5ms) SELECT `users`.* FROM `users` WHERE `users`.`user_name` = 'yachibit ' => [#<User id: 1, first_name: "Bit", last_name: "Yachi", user_name: "yachibit", ... >] 予想として、'yachibit'さんは存在しますが、'yachibit 'さんはいないので、レコ</user>…

Railsでsessionを空にしたり削除したり

# 空ハッシュにする session[:hoge] = {} # sessionが多重配列になっている場合、 session[:hoge][:fuga] # => nil # nilにする session[:hoge] = nil # sessionが多重ハッシュになっている場合、 session[:hoge][:fuga] # => NoMethodError: undefined meth…

Railsのmigrationでdefault valueをrollbackしたい

Railsでカラムにデフォルト値を設定するmigrationを書いた際、 class AddDefaultValueOfEmploymentTypeOnUser < ActiveRecord::Migration def up change_column :users, :employment_type, :integer, default: 1 end def down change_column :users, :employ…

RubyでArrayからHashを生成するいろいろ

Hash['hoge', 1, 'fuga', 2] # => {"hoge"=>1, "fuga"=>2} Hash['hoge', 1, 'fuga', 2 , 3] # ArgumentError: odd number of arguments for Hash array = ['hoge', 1, 'fuga', 2] Hash[array] # warning: wrong element type String at 0 (expected array) #…

left outer joinのコスト

Railsではjoinsメソッドを使ってSQLのJOINを表現できる。これは基本的にINNER JOINだが、こうするとLEFT OUTER JOINも書ける。 User.joins("LEFT JOIN bookmarks ON bookmarks.bookmarkable_type = 'Post' AND bookmarks.user_id = users.id") => SELECT "us…

delayed_jobで非同期実行指定したメソッドをデバッグ時に即座に実行する

Rubyで処理を非同期実行したい場合に使うgemはいくつかありますが、自分はdelayed_job(以下、DJ)を使ったります。 DJではメソッドを常に非同期で実行したい場合、handle_asynchronouslyを使って次のように書きます。 class Device def deliver # long runn…