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

ワシはワシが育てる

週刊少年ジャンプと任天堂のゲームが三度のメシより好きです。

Ruby on Rails

Railsで静的ファイルをS3に置くならasset_syncがオススメ

RailsのアプリケーションでprecompileしたassetファイルをAmazon S3から読み込みたい、という時にはasset_syncというgemがオススメです。 asset_syncの設定後、precompileをすると対象のS3バケットにCSSや画像などの静的ファイルが自動でアップロードされ、…

Rails4.2にあげるとローカルIPでアクセスできない問題

Rails4.2にバージョンアップ後、いつも通り起動しローカルIPを通じてスマホからアクセスしようとしたところつながらない状況に。 Railsのバージョンアップが原因だとほぼ特定していたのでRelease Noteを見ると、Rackの変更によって、デフォルトではlocalhost…

Unicorn+NginxでリバースプロキシしたときにFacebookのOAuthでつまづいた

RailsアプリをUnicornで動かし、Nginxをリバースプロキシとして前面に置く構成。 その際にFacebookのOAuthを利用すると「指定されたURLは、アプリケーションの設定で許可されていません。」というエラーメッセージが表示されてしまいました。 原因はリバース…

RubyMineが最強すぎて感動する

最近Qiita界隈でRubyMine特集がされていたこともあって、RubyMine使ってみたら最強すぎて感動しました。 理由は色々ありますが書くのが面倒なので箇条書きにします。 補完が想像以上に強力 gemでも、環境依存ファイルの定数でも補完してくれます エディタが…

Railsのafter_commitでcreateやupdateなどを判別する

sidekiqで非同期に通知を送るときにハマったこととその対処法 - ワシはワシが育てる 上の記事でも触れていたことですが、after_commit時のレコードからcreate,update,destroyなどのアクションを判別する正規の方法を見つけたので書きます。 以前の記事を書い…

sidekiqで非同期に通知を送るときにハマったこととその対処法

Railsの非同期処理で最も人気のあるライブラリの一つであるSidekiqでハマったこととその対処法について。 とあるテーブルのレコードが保存されたタイミング(after_createなど)でobserverがそれを拾い、sidekiqに通知タスクを投げた際、sidekiqがそんなレコー…

Railsのbefore_saveで値にfalseを設定する時の注意

モデルのbefore_saveで特定のカラムの状況に応じて、booleanの値を設定したい場合、値にfalseを設定してメソッドを終了すると、save自体がエラーなってしまいます。 before_save :hoge def hoge if self.value == 1 self.boolean_data = false end end 上の…

springのバージョンでハマったら

Rails関連のコマンドを爆速にしてくれる便利なspringですが、バージョンアップ時にハマったのでメモがてら。 ある日、何も考えずbundle updateした後、springコマンドを使用したらこんなメッセージが。 There is a version mismatch between the spring clie…

個人的に考えるビジネスロジックをModelに書く意味

一昔前にはMVCモデルではビジネスロジックをコントローラーに書くのかモデルに書くのか議論になりましたが、おそらく潮流としてモデルに書くのが暗黙の了解になっているかと思います。 とはいえMVC覚えたてのうちはどうしてもその意味がわからず、Controller…

Railsのmigrationの扱い方

Railsでデータベーススキーマを定義するmigrationはアプリケーションを作り始めた当初こそ便利ですが、継続的に開発してくると扱いに困ることがしばしばあります。 既存のテーブル構造を変更する度に逐一定義ファイルを作成していると、気づけばmigrationフ…

Deviseでパスワード変更時にログアウトしない方法

Railsのデファクト認証システムの一つであるDeviseにおいて、デフォルトではログイン中にパスワードを変更するとサインアウトされてしまいます。 原因としては保持しているセッション情報と、更新されたデータベースとの整合が取れずにサインアウトされてし…

『RailsでWebSocketを使う』の続き

過疎なこのブログで地味ながらもはてブされている『RailsでWebSocketを使う』の続きというか感想です。 この記事を書いてからレガシーブラウザにも対応しているFayeも含め、Railsを用いたリアルタイム処理について試行錯誤したのですが、結論としてRailsでリ…

Railsのi18nでタグを仕込む

ぶっちゃけ公式ドキュメントが平易な英語で丁寧に説明してあるので、こっちを1度目を通せば事足りる話ですがメモがてら。 公式ドキュメント: http://guides.rubyonrails.org/i18n.html デフォルトで国際対応の文言はタグがエスケープされてしまいますが、そ…

Rubyでマルチスレッド・マルチプロセスのプログラムを書くならParallelが便利

Rubyでは比較的簡単にマルチプロセス、マルチスレッドのプログラミングができますが、それでもやや煩雑な書き方になってしまいます。 それらの処理を簡単に書くためのライブラリとしてparallelがオススメです。 ループの前に少し構文を加えるだけで簡単にマ…

Deviseでログイン・ログアウト後のflashメッセージを削除する

Railsの認証ライブラリ筆頭であるDeviseはセキュアで高度な認証を肩代わりしてくれる一方、中の挙動を把握していないと扱いにハマることがしばしばあります。 Deviseはi18nに対応しており、ログイン・ログアウトなどのアクションを行った際にflash[:notice]…

jbuilderをコントローラー内で使用する

jbuilderはRailsのJSONジェネレーターのデファクト的なライブラリでAPI作成には欠かせません。 jbuilderはデフォルトでpartialの機能が備わっているので、一部機能を切り離したい時にはpartialを使用するのが通例なようです。 ただしViewのpartialはクラス内…

RailsでMyISAMを使うときの注意

MyISAMは当然ですがトランザクションが効きません。 その反面、更新性能が高く、閲覧履歴などデータを高頻度に蓄積するときなどに重宝します。 ただしRailsで使う場合、これを「単にInnnoDBのトランザクションが効かない版」として捉えるとハマります。 とい…

フルJSサイトのSEO対策

Backbone.jsなどクライアントMVCを使って動的にHTMLを生成する際のSEO対策について。 サーバーサイドがJSONを生成し、それを元にテンプレートでHTMLを動的に作成し挿入、というのが代表的な手段です。 しかしそれだけではソースコード上はスッカラカンで、SE…

何だかんだ言ってCSSを書く文字数が圧倒的に多い

ウェブサイトをRailsでゴリゴリ書いていると、モデル周り等はAPIを使いまわせるし、ビジネスロジックは一つのコントローラーで200行程度なのに、CSSは少なくとも500行、多ければ普通に4桁の世界に入る。 JSやHTML(hamlとかslim)もせいぜい100行~200行くらい…

Railsで複数のhas_oneを行う際の注意

Railsで以下のような状況を想定します。 class Blog < ActiveRecord::Base has_many :articles has_one :last_article, -> { order(id: :desc) }, class_name: :Article end class Article < ActiveRecord::Base belongs_to :blog end Blogが複数のArticleを…

Rails(ActiveRecord)でgt、ltを使う

最近仕事が忙しくて(とても良いこと)、更新が滞りがちです。 年内年始までタスクがギッシリですが、なんとかブログも更新できるよう努力します。 今回はRuby on RailsなどでActiveRecordを使う際に 「より大きい」「より小さい」を意味するgt、ltを使う方法…

Rakeタスクをライブリロードする

Railsアプリの資産を活かしたまま、ウェブサイトのクロールなど自動化したい処理を書くにはrakeタスクが便利です。 rspecのように自動更新したままタスクを書いていけると効率的ですね。 guard-rakeという専用のgemがあるのですが、taskを変更した際に実行さ…

RailsでWebSocketを使う

タイトルの通り。 HTML5の標準規格から外されたものの、次世代に欠かせない機能の一つになるでしょう。 ただしandroidブラウザーは最新4.4以降から、IEは10以降からとブラウザ制約があるので注意が必要です。 使い方は非常に簡単です。 # gemに下記を追加 ge…

node.jsでフロントエンドを書くにあたって

これまでnode.jsはバックエンドとして利用してきたが、数時間くらいで作れるような簡単なアプリケーションに対して、わざわざフロントとバックを分けるのも面倒。 ということでフロントを書く準備をしたが、ベストプラクティスが見つかりづらい。 小さいアプ…