Rails

Rails 4.0 の STI を development モードで使うとサブクラスがロードされない問題

単一テーブル継承はたまに使いますが、使うたびに何かしら問題が起きる気がします。 class Animal < ActiveRecord::Base end class Dog < Animal end class Cat < Animal end これらのクラスを(実際は色々と問題があるので別ファイルに分けて)実装し Anima…

Rails 5.0 beta-2 で Puma のコンフィグを適用させたい

Rails 4.2 以降は rails server コマンドで起動するサーバが localhost で立ち上がるため LAN 内の別マシンからアクセスさせたい場合は bundle exec rails s -b 0.0.0.0のようにコンフィグを設定する必要がありました。Rails 5.0 からはデフォルトのサーバが…

Rails のカスタム例外補足時に順番に注意が必要な件

次のようなコードを Rails 4.0 系の controller に記述すると rescue_from ActiveRecord::RecordNotFound, with: :render_404 rescue_from ActionController::RoutingError, with: :render_404 rescue_from Exception, with: :render_500 内部では ActiveRec…

redirect_to とフラグメント修飾子と実体参照

前振り フラグメント修飾子とは、今回の話の範囲では http://api.rubyonrails.org/classes/ActionDispatch/Http/URL.html#method-c-url_for というアドレスに含まれる「#」以降、つまり「method-c-url_for」の部分になります。そして Safari を使ってリダイ…

wicked_pdf で Rails が送信するメールに PDF を添付する

表題の件ですが、案外はまってしまったので備忘録。 前提 以下の環境で確認 Rails 4.1.6 Ruby 2.0.0-p247 メーラーの準備 元々のコードがこうだったとして class NotifyMailer < ActionMailer::Base def customer(mail_object, document) @mail_object = mai…

wicked_pdf を Rails アプリケーションで使うまで

html から簡単に PDF が作れる便利なプラグインですが、割と面倒な行程が必要だったのでメモ。Rails 4.1 で確認しました。 インストール Gemfile で以下のように記述します。 gem 'wkhtmltopdf-binary' gem 'wicked_pdf' が、環境によってはこれでは動作しま…

ActiveModel::Model で簡単に ActiveModel の機能を利用する

例えばユーザからの問い合わせを受け付けるメールフォームなど、特にデータベースに値を保存したりする必要はないが ActiveModel の機能は使いたいケースで Rails 4 では ActiveModel::Model をインクルードする事で簡単に処理できます。 class MailForm inc…

jQuery UI を Rails 4 のプロジェクトに導入する

表題の件について datepicker の導入を例に説明します。 まずは Gemfile を更新。 gem 'jauery-rails' この下に gem 'jauery-ui-rails' を追加します。終わったら bundle install をお忘れなく。 次に app/assets/javascripts/application.js を更新。 // re…

acts_as_taggable_on で jQuery を使った入力補助を行う

acts_as_taggable_on は便利なプラグインですが、デフォルトでは「tag1,tag2,tag3」のようにタグを半角カンマで区切った入力を行うため、一般のユーザ向けとは言えません。そこで jQuery を使って入力補助を行います。Rails 4.0 + Ruby 2.0 で検証しました。…

Rails 4 + Ruby 2.0 で画面遷移無しのファイルアップロード

表題のとおりのサンプルプロジェクトを作成します。まずはプロジェクトを新規作成します。 rails new sample_uploadscaffold でアップロード機能を作成、この辺はいつもどおり。 bundle exec rails g scaffold attachments title:string path:text何かと不便…

Rails の request.remote_ip には何の値が入っているのか

表題の通り Rails 3.2.X 系の request.remote_ip に入っている値について調べました。 最初に結論 リクエストヘッダを読み HTTP_CLIENT_IP, HTTP_X_FORWARDED_FOR, REMOTE_ADDR の順にセットされていた値を取得してきます。 ソースコード http://api.rubyonr…

マイグレーションのバージョン管理

過去の経緯 Rails 2.1 以前のバージョンでは、マイグレーションファイルは「001_create_hoge.rb」のように単純な連番で管理されており、現在のマイグレーション番号については schema_info というテーブルで最後に実行された数値だけを管理していました。 そ…

Rails 3.2.13 の Associations でデッドロックが起こるかもしれない問題

データベースに InnoDB の MySQL を用いた Rails アプリケーションで、次のような二つのクラスを用意します。 class Parent < ActiveRecord::Base attr_accessible :name has_many :children, :dependent => :destroy end class Child < ActiveRecord::Base …

Rack::Protection を Rails 3.2.X から使う

脆弱性対策を自分で考えるのは限界があるので、仕組みについてはきちんと知った上でライブラリのお世話になりましょう。これ自体は Rack を用いたアプリケーションであれば何でも使えるのですが、今回は Rails で使う場合のお話をします。 導入手順 まずアプ…

jquery-rails 2.1.X で IE6 を使った際の不具合と対処

Rails 3.2.X で jquery-rails 2.1.X を使った際に <%= link_to 'サンプル', hoge_path, :remote => true %> のように remote を指定して ajax で通信するリンクが IE6 で動作しない問題が発生していました。本流の方にはマージされていないのですが、解決策…

ActiveRecord の scope で時刻が一度しか評価されない

表題の現象を確認するために、次のような scope を記述します。 class Hoge < ActiveRecord::Base scope :fuga, where(["some_time <= ?", Time.now]) end これは文法のエラーを起こさないので正しく動作しているように見えますが、実際にはアプリケーション…

MongoDB を Rails から使う、導入編

三周遅れくらいの話題ですが、最近お仕事で扱うデータのサイズや件数が増えて来て困る事が多いので今後に備えて。 MongoDB のインストール Windows でも Mac でもバイナリが配布されているのでダウンロードして解凍するだけで動き Linux の場合も大体のパッ…

Rails 1.X 系特有の case 節の不可解なエラーと修正

今更 Rails 1.X 系で作られたアプリケーションの保守をしている方がどの程度いるのかも定かではありませんが、ハマると気がつきにくいのでメモ。上記環境でビューで用いる .rhtml ファイルで次のような記述をすると、不可解な構文エラーが発生する事がありま…

Rails の Migration で MySQL の文字列型に BINARY 属性をつけるには

MySQL の文字列型が大文字と小文字を区別してくれない事をつい忘れてしまい、時々問題になるので備忘録を兼ねて。前述の通り MySQL では char や varchar さらに text 型と言った文字列型で大文字と小文字が区別されません。これを回避するにはカラムの作成…

ActiveRecord のキャッシュをオフにする

あるテーブルのすべてのフラグを false にしたい時に、件数が多くなる事が予想されたので1000件ずつ処理しようと考え、次のようなコードを書きました。 while Hoge.where("flag IS true").count > 0 sql = "UPDATE hoge SET flag = false WHERE flag IS true…

mail-iso-2022-jp gem を用いた際に Encoding::UndefinedConversionError が発生

Rails のアプリケーションで mail-iso-2022-jp gem の 1.1.6 を使っていたところ、表題のエラーが発生。 gem の中身を確認してみました。 vi /path/to/gem/mail-iso-2022-jp-1.1.6/lib/mail-iso-2022-jp/patches.rb# coding:utf-8 require 'mail' require 'b…

link_to に :method => :delete を指定した時の動作

以下 Rails 3.2.2 について記述します。 scaffold 等で作られる削除のリンクは次のようになっていると思います。 <%= link_to 'Delete', users_path(@user), :method => :delete, :confirm => 'Are you sure?' %> これと同じコードを手で書いて使おうとした…

変数を含むパスの定義

Rails 3.2.2 で、パスに含まれる値を変数として扱うルーティングを定義したい時の記述方法について。 以下のサンプルではユーザの管理は User モデルで行い、必ず一意である name という値を持ち、ユーザ毎に Item モデルを操作可能だとします。まずは route…

bundle update 実行時の注意点

アプリケーション開発中に何らかの理由(主に Rails のバージョン更新)で bundle update を実行する際の注意点について。アプリケーションサーバ(Webrick, Passenger, Unicorn 等)を起動した状態で bundle update を叩くと Gemfile.lock の更新が行われず…

Rails 3.2 で link_to :remote => true を使ってフォームに入力された値を取得する

Rails3 系では link_to_remote は link_to :remote => true に変更されています。 <%= link_to 'Ajax 風リンク', hoge_url, :remote => true %> この時 link_to_remote では使えた :with や :submit といった、現在フォームタグに入力された値を get で渡す…

Rails 3.2 で CarrierWave を使う時に public 以下にファイルを置きたくない場合

CarrierWave は便利なプラグインですが、デフォルト設定のまま Rails で使うと public 以下の誰でもアクセス可能なディレクトリにファイルを書き込んでしまいます。これでは困る場合は config/application.rb で以下のようにデフォルトのアップロード先を指…

Rails3.1 の initializers でコンフィグファイルを読み込む

config/app_config.yml という名前でファイルを作って config/initializers/app_config.rb から呼び出す時に APP_CONFIG = YAML.load(File.open(Rails.root + '/config/app_config.yml')) で読めるかなと思ったのですが、うまくいかない模様。Rails.root は …

Rails3 の routes.rb に独自定義を追加する

通常の CRUD 操作に必要なルーティングの定義は resources でまかなえますが、よくある確認画面を挟む時のルーティングについて説明します。新規作成時の確認画面を confirm_create に、更新確認画面を confirm_update にそれぞれネーミングします。また、モ…

ActiveRecord3 のタイムゾーンをローカルに設定する

単純に時刻をローカル(ここでは JST)に設定するだけなら config/application.rb で config.time_zone = 'Tokyo' と書くだけのように思えますが、この状態では ActiveRecord 内部の設定では日時が UTC で扱われ、データベースに保存される値も UST から JST…

Rails から MySQL に SSL を用いて通信を行う

ActiveRecord には SSL によるデータベースアクセスをサポートする機能が付属しているので、それを使って通信を暗号化してみます。検証には VirtualBox にインストールした CentOS 5.6 を使用し、作業はすべて root ユーザで行いました。 前提 mysql と open…