Rails

CentOS5.6 で MySQL+Nginx+Unicorn な Rails アプリを動かす

完全に自分用の備忘録。VirtualBox にインストールした CentOS5.6 に表題の環境を構築してサーバを動かすまで。 サーバのメモリは512Mでパーティションは40Gと、(記事執筆時では)一般的な低価格帯 VPS を意識したスペックに調整してあります。 また、すべ…

Anonymous Controller を使ってコントローラのテストを RSpec で記述する

ApplicationController に以下のような認証用のメソッドを定義する事は、よくあると思います。 # coding: utf-8 class ApplicationController < ActionController::Base # 略 def current_user # ログイン中のユーザオブジェクトを返す end def logged_in? #…

Rails3.0 で MySQL のストアドプロシージャを呼び出してみる

ストアドプロシージャにまつわる諸々は MySQL のマニュアル等をご参照のこと。ここでは SQL レベルのお話にとどめます。 MySQL 側でストアドプロシージャを用意する 今回はきわめて簡単な SELECT 文をストアドプロシージャとして定義します。 CREATE PROCEDU…

incompatible character encodings: UTF-8 and ASCII-8BIT

Ruby 1.9.2 + Rails 3.0.3 の環境で表題のエラーが発生。データベースからマルチバイト文字列を取得する事は出来るのですが、多言語対応のための config/locales/ja.yml やビューの日本語が読み取れない様子。エラーの原因をトレースしていくと、以下のファ…

Rails 3.0 の ActiveRecord::Base.find_all の挙動について

月別アーカイブを作成したい時などに DBMS 独自の時刻関数を使う事は多いと思いますが、今回そのあたりに関連して ActiveRecord の挙動でハマったのでメモ。例えば次のような SQL を PostgreSQL の psql コマンドから実行したとします(データベースに costs…

Rails 3.0 の scope で first は使えない

例えば次のような scope を costs.rb に定義します。 class Cost < ActiveRecord::Base scope :next, lambda{|day| where(["occured_on > ?", day]).order("occured_on").first } end これはシンタックスエラーにはなりませんが、実行すると次のようなエラー…

Rails 3.0 の production モードでは静的ファイルが自動ロードされない

社内でテスト運用しているアプリを Rails 3.0 + PostgreSQL 9.0 + Unicorn + Nginx で動かそう!という話になって、とりあえず Unicorn 単体で Rails アプリを起動するところまでこぎつけたのですが、なぜか public 以下に置かれたファイルが 404 Not Found …

Rails 3.0 + jQuery で RJS

本題に入る前に、そもそも RJS とは何なのかを説明すると、本来 jQuery の $.ajax() などを使ってごりごり書かないといけなかった JavaScript による非同期通信をフレームワーク側で吸収して、通常の html ビューのレンダリングと同じ感覚で記述できるように…

Cucumber の日付のステップ定義

Rails で Cucumber を使っていて、デフォルトのステップ定義はどこでしてるんだろう?と気になったので調べてみました。結論から言うと Rails.root/features/step_definitions 以下に入っています。てっきり gem の方にあるのかと思って、そっちを必死に gre…

default_locale を日本語にすると date_select が使えない件

表題の通り、なぜか Scaffold で作った date_select が動かなかったので。Can't convert Symbol into String だそうなので、エラーを追いかけるとどうやら config.i18n.default_locale = :ja とした時に date_select にきちんと値が渡らなくなる様子。該当す…

Rails 3.0 + RSpec 2.0 で autotest

びぼうろく。Mac OSX 10.5 上で Rails 3.0 と RSpec 2.0 を使ってテストをします。 インストール 利用する gem を RAILS_ROOT/Gemfile に記述します。 group :development, :test do gem 'rspec', '>=2.0.0.beta.20' gem 'autotest' gem 'rspec-rails', '>=2…

Rails 3.0 で cucumber のテストを通す

備忘録。Mac OSX 10.5 環境で Rails 3.0 を使って cucumber でテストを書きます。 インストール 主に下のリンクを参照しました。http://d.hatena.ne.jp/yuunachan/20101004/1286161317なお、私の環境(Mac OSX 10.5)では Nokogiri が libxml2 のバージョン…

Arel の include の挙動が面白い

Rails3.0 で導入された Arel を試してみたら、なかなか面白い動きをしていました。 Unit を継承した Expense モデルが Reason に紐づいている(belongs_to)として、以下のような scope を作ります。 scope :monthly, lambda {|month| includes(:reason).whe…

Juggernaut ですの!

Rails 向けの Comet サーバ Juggernaut を使います。サンプルとして、ごくごく簡単なチャットシステムを作ります。公式サイトは以下。http://juggernaut.rubyforge.org/ 準備 Ruby on Rails はインストール済として、他に必要なものをインストールします。と…

delete_all と destroy_all について

諸事情で Rails 1.1.6 を使っているため、最近の事情には合致しないかもしれませんが、以下のような違いがありました。データベースには MySQL を使っています。items と users が多対多の関係で、中間テーブルに item_users を用いているとします。高速化の…

MySQL の IN の記述

MySQL で WHERE 句に IN を指定するとき、以下のような挙動を起こします。 select * from table where id in (1,2,3); この場合、(存在する限り、以下同様)id が 1, 2, 3 のレコードが取得されます。 select * from table where id in ("1","2","3"); この…

キャッシュとサイドバー

某社の皆さんにも確認したのですが、やはり blog のサイドバーのような(公開されている)すべてのページに含まれる動的アイテムは partial や helper と before_filter などで用意するのが一般的なようです。以前存在した components という考え方は Rails …

rails の render 軽くまとめ

定期的に rails render controller で検索される方がいるようなので、もう一度まとめ。 まず rails の ActionController の render に :controller オプションはありません。コントローラをまたいだレンダリングを行いたいなら :template か :file オプショ…

counter_cache の値を手動で更新する

何かで困ったときや、既存のモデルに counter_cache を使いたくなったときなどに。どうやら readonly になっているらしく、以下のメソッドを使わないと更新できないようです。 Item.update_counters(id, :column_name => number) id には更新したい対象の id…

月別アーカイブ的な何か

この blog には表示していませんが、2009年1月のアーカイブ、のように月別で記事の一覧を表示している事はよくあります。 あれを Rails で行うとなると、こんな感じになると思います。 # 条件を年と月に設定してグループ化し、記事数をカウント archives = P…

静的コンテンツを表示してみる

Rails で静的コンテンツを置く場所は RAILS_ROOT/public 以下が一般的です。ですが、レイアウトは共有したいとか、そもそも公開された場所に置きたくないという場合は少し工夫する必要があります。今回は html を任意に呼び出して表示するサンプルを載せてみ…

active_scaffold と attachment_fu の併用

active_scaffold の内部で attachment_fu を動かす方法の解説。Attachment というあらゆる種類のデータをアップするモデルを使うものとして解説します。 ファイルのアップロード まずはコントローラ attachments_controller を編集します。 class Attachment…

WikiForme を Rails に放り込んでみる

HParser から始まってパーサを調べていたら WikiForme という俺様用パーサ作成装置を発見しました。これを Rails に導入してみます。 まずは CodeRepos に最新版と思しきソースが公開されているので、そこからソースを拾います。 svn co http://svn.coderepo…

i18n をちょこちょこ調べてみる

前回は動かすだけ動かして満足してしまったので、国際化について軽く補足。私が理解している範囲の話かつ、今後どんどん改良が進みそうな分野なので情報が陳腐化する可能性大。 デフォルトの言語設定 国際化の前に、デフォルトの言語設定は config/embironme…

render :file

いつの間にできたんだこんなの。以前の記事で別コントローラのビューを呼び出すのに悪戦苦闘していましたが、これ使えば楽勝みたいですね。 # comments_controller 内部とお考え下さい # post has_many comments とお考え下さい # map.resources の has_many…

学校の Tiger に Rails 環境を整えたでござるの巻

Leopard には標準で RubyGems や Rails が入っているのですが、 Tiger はそうもいきません。一々ノーパを持ち込むのもだるいので、学校の俺専用と化したマシンにインストール作業を行ってきました。 一応、普通のインストールメモとしても利用可能。特に学校…

RubyAMF で関連を扱う

RubyAMF の続き、今度は関連を扱います。一対多と多対多のケースについて。 ここを読む前に、以前の記事を参照してとりあえず RubyAMF を動かしてみることをオススメします。 一対多のサンプル 以下のようなモデルと関連を考えます。ユーザ登録画面のユーザ…

とりあえず動く RubyAMF

RubyAMF とは Flash と Rails の間でオブジェクトの相互変換を行ってくれるプラグイン。 サンプルでは Hello World の送信をしているくらいのものしかなかったので、モデルの情報を Flash 側から入力して Rails で受け取るまでの最小限のサンプルコード。例…

if_found メソッドを本格的に考えてみる

コード def if_found(obj, msg = "デフォルトのエラーメッセージ", action = "index", controller = controller_name) if obj yield if block_given? else flash[:error] = msg redirect_to :controller => controller, :action => action end end 使い方 ま…

あるモデルのサブクラスを定義する

サブクラスの作成等を、 Rails が受け持ってくれる機能について。ファイルのアップロードなど、場合によって validation の条件を分けたりしたい時などにも便利です。 前提 Rails の機能で簡単にサブクラスを作成する場合、親クラスに type というカラムを s…