破いて捨てたノート

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

Ruby

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もおもしろい内容のものが多…

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

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

RubyのArrayとかHashのuniqueに関する挙動のメモ

RubyのArrayにはuniqってメソッドがあるじゃん? irb(main):001:0> [:foo, :bar, :baz, :foo] => [:foo, :bar, :baz, :foo] irb(main):002:0> [:foo, :bar, :baz, :foo].uniq => [:foo, :bar, :baz] この辺はあたりまえだが、 たまにお世話になる多重配列に…

.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…

Ruby 仮引数の * と実引数の *

よく混乱してしまうので整理。 仮引数の * は可変長引数 def greet name, *messages messages.each do |message| puts "#{message}, #{name}." end end greet 'Ruby', 'Hello', 'こんにちは' # => "Hello, Ruby." "こんにちは, Ruby." # 単に引数を無視した…

列挙型の値を保存するときは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 次の日に…

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) #…

2014年1月に読んだ本

2014年1月に読んだ本。 技術書 パーフェクトRuby パーフェクトRuby (PERFECT SERIES 6)作者: Rubyサポーターズ,すがわらまさのり,寺田玄太郎,三村益隆,近藤宇智朗,橋立友宏,関口亮一出版社/メーカー: 技術評論社発売日: 2013/08/10メディア: 大型本この商品…

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

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