Rails
単一テーブル継承はたまに使いますが、使うたびに何かしら問題が起きる気がします。 class Animal < ActiveRecord::Base end class Dog < Animal end class Cat < Animal end これらのクラスを(実際は色々と問題があるので別ファイルに分けて)実装し Anima…
Rails 4.2 以降は rails server コマンドで起動するサーバが localhost で立ち上がるため LAN 内の別マシンからアクセスさせたい場合は bundle exec rails s -b 0.0.0.0のようにコンフィグを設定する必要がありました。Rails 5.0 からはデフォルトのサーバが…
次のようなコードを 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…
前振り フラグメント修飾子とは、今回の話の範囲では http://api.rubyonrails.org/classes/ActionDispatch/Http/URL.html#method-c-url_for というアドレスに含まれる「#」以降、つまり「method-c-url_for」の部分になります。そして Safari を使ってリダイ…
表題の件ですが、案外はまってしまったので備忘録。 前提 以下の環境で確認 Rails 4.1.6 Ruby 2.0.0-p247 メーラーの準備 元々のコードがこうだったとして class NotifyMailer < ActionMailer::Base def customer(mail_object, document) @mail_object = mai…
html から簡単に PDF が作れる便利なプラグインですが、割と面倒な行程が必要だったのでメモ。Rails 4.1 で確認しました。 インストール Gemfile で以下のように記述します。 gem 'wkhtmltopdf-binary' gem 'wicked_pdf' が、環境によってはこれでは動作しま…
例えばユーザからの問い合わせを受け付けるメールフォームなど、特にデータベースに値を保存したりする必要はないが ActiveModel の機能は使いたいケースで Rails 4 では ActiveModel::Model をインクルードする事で簡単に処理できます。 class MailForm inc…
表題の件について datepicker の導入を例に説明します。 まずは Gemfile を更新。 gem 'jauery-rails' この下に gem 'jauery-ui-rails' を追加します。終わったら bundle install をお忘れなく。 次に app/assets/javascripts/application.js を更新。 // re…
acts_as_taggable_on は便利なプラグインですが、デフォルトでは「tag1,tag2,tag3」のようにタグを半角カンマで区切った入力を行うため、一般のユーザ向けとは言えません。そこで jQuery を使って入力補助を行います。Rails 4.0 + Ruby 2.0 で検証しました。…
表題のとおりのサンプルプロジェクトを作成します。まずはプロジェクトを新規作成します。 rails new sample_uploadscaffold でアップロード機能を作成、この辺はいつもどおり。 bundle exec rails g scaffold attachments title:string path:text何かと不便…
表題の通り 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 というテーブルで最後に実行された数値だけを管理していました。 そ…
データベースに InnoDB の MySQL を用いた Rails アプリケーションで、次のような二つのクラスを用意します。 class Parent < ActiveRecord::Base attr_accessible :name has_many :children, :dependent => :destroy end class Child < ActiveRecord::Base …
脆弱性対策を自分で考えるのは限界があるので、仕組みについてはきちんと知った上でライブラリのお世話になりましょう。これ自体は Rack を用いたアプリケーションであれば何でも使えるのですが、今回は Rails で使う場合のお話をします。 導入手順 まずアプ…
Rails 3.2.X で jquery-rails 2.1.X を使った際に <%= link_to 'サンプル', hoge_path, :remote => true %> のように remote を指定して ajax で通信するリンクが IE6 で動作しない問題が発生していました。本流の方にはマージされていないのですが、解決策…
表題の現象を確認するために、次のような scope を記述します。 class Hoge < ActiveRecord::Base scope :fuga, where(["some_time <= ?", Time.now]) end これは文法のエラーを起こさないので正しく動作しているように見えますが、実際にはアプリケーション…
三周遅れくらいの話題ですが、最近お仕事で扱うデータのサイズや件数が増えて来て困る事が多いので今後に備えて。 MongoDB のインストール Windows でも Mac でもバイナリが配布されているのでダウンロードして解凍するだけで動き Linux の場合も大体のパッ…
今更 Rails 1.X 系で作られたアプリケーションの保守をしている方がどの程度いるのかも定かではありませんが、ハマると気がつきにくいのでメモ。上記環境でビューで用いる .rhtml ファイルで次のような記述をすると、不可解な構文エラーが発生する事がありま…
MySQL の文字列型が大文字と小文字を区別してくれない事をつい忘れてしまい、時々問題になるので備忘録を兼ねて。前述の通り MySQL では char や varchar さらに text 型と言った文字列型で大文字と小文字が区別されません。これを回避するにはカラムの作成…
あるテーブルのすべてのフラグを false にしたい時に、件数が多くなる事が予想されたので1000件ずつ処理しようと考え、次のようなコードを書きました。 while Hoge.where("flag IS true").count > 0 sql = "UPDATE hoge SET flag = false WHERE flag IS true…
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…
以下 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…
アプリケーション開発中に何らかの理由(主に Rails のバージョン更新)で bundle update を実行する際の注意点について。アプリケーションサーバ(Webrick, Passenger, Unicorn 等)を起動した状態で bundle update を叩くと Gemfile.lock の更新が行われず…
Rails3 系では link_to_remote は link_to :remote => true に変更されています。 <%= link_to 'Ajax 風リンク', hoge_url, :remote => true %> この時 link_to_remote では使えた :with や :submit といった、現在フォームタグに入力された値を get で渡す…
CarrierWave は便利なプラグインですが、デフォルト設定のまま Rails で使うと public 以下の誰でもアクセス可能なディレクトリにファイルを書き込んでしまいます。これでは困る場合は config/application.rb で以下のようにデフォルトのアップロード先を指…
config/app_config.yml という名前でファイルを作って config/initializers/app_config.rb から呼び出す時に APP_CONFIG = YAML.load(File.open(Rails.root + '/config/app_config.yml')) で読めるかなと思ったのですが、うまくいかない模様。Rails.root は …
通常の CRUD 操作に必要なルーティングの定義は resources でまかなえますが、よくある確認画面を挟む時のルーティングについて説明します。新規作成時の確認画面を confirm_create に、更新確認画面を confirm_update にそれぞれネーミングします。また、モ…
単純に時刻をローカル(ここでは JST)に設定するだけなら config/application.rb で config.time_zone = 'Tokyo' と書くだけのように思えますが、この状態では ActiveRecord 内部の設定では日時が UTC で扱われ、データベースに保存される値も UST から JST…
ActiveRecord には SSL によるデータベースアクセスをサポートする機能が付属しているので、それを使って通信を暗号化してみます。検証には VirtualBox にインストールした CentOS 5.6 を使用し、作業はすべて root ユーザで行いました。 前提 mysql と open…