var json = <%= {:foo => "FOO"}.to_json.html_safe %>;
Wednesday, September 19, 2012
Rails3のviewで、JavascriptのオブジェクトにRubyのオブジェクトをjson(など)で渡す
Sunday, April 08, 2012
Rails3でscaffoldのテンプレートをカスタマイズ
$ rake rails:templates:copyあとは作成されたテンプレートをいじるだけ。以下、作業内容など。
- デザインに関すること(CSS用のクラス設定など)
- will_pagenateのページング対応
- 文言の日本語化
- .rbファイルにマジックコメントを追加 (# -*- coding: utf-8 -*-)
Tuesday, February 21, 2012
Rails3からRabbitMQに接続
Ruby AMQPはEventMachineに依存しているため、利用する際にはEventMachineのイベントループ内にいる必要がある。RailsからRabbitMQに接続する場合は、RailsのプロセスからRabbitMQにTCPのコネクションを張り、その中でchannelを作成することになる。
RabbitMQとのコネクションは、$RAILS_ROOT/config/initializers/amqp.rbというファイルを作成してその中で作成すると、起動時に実行されてコネクションを繋いでおくことができる。
接続設定
接続の設定ファイルはconfig/amqp.ymlなどとして保存しておけばいいんじゃないでしょうか。
development: host: localhost vhost: development test: host: localhost vhost: test production: host: localhost vhost: production
Thin
RailsのサーバーにThinを利用している場合、ThinがEventMachineベースなので特に気にせずconfig/initializers/amqp.rbには以下のように記述すれば良い。
def connect
yml = YAML.load File.read(File.join(Rails.root, 'config/amqp.yml'))
config = {}
yml[Rails.env].each do |key, value|
config[key.to_sym] = value
end
AMQP.connection = AMQP.connect(config)
end
EventMachine.next_tick do
connect
end
controllerでパブリッシュ
例えばAmqpController/publishでパブリッシュする場合、以下のようになる。
class AmqpController < ApplicationController
def publish
connection = AMQP.connection
channel = AMQP::Channel.new(connection)
exchange = channel.direct 'ex.direct'
msg = 'Hello, world'
exchange.publish(msg, :routing_key => 'tasks')
render :text => msg
end
end
参考
Thursday, January 26, 2012
RAILS_ENVの追加や環境ごとの違いへの対応方法
Railsではデフォルトでdevelopment, test, productionという環境に対応できるように作られているのはご存知の通り。 この環境ごとの設定や、新しい環境の追加方法などについて、簡単にまとめる。
ちなみに執筆時点では以下の実行環境を利用している。
- Ruby: 1.9.2
- Ruby on Rails: 3.0.5
環境名を取得する
Rubyのコードの中から現在の環境名(development|test|productionなど)を取得するのは、Rails.envを利用する。
新しい環境設定を追加する
例えばstagingという環境を新規に追加するには、以下の作業をする。
- RAILS_HOME/config/environmentsにあるproduction.rbをstaging.rbにコピーする
- database.ymlにstagingの項目を追加する
$ rake db:create RAILS_ENV=staging $ rake db:migrate RAILS_ENV=staging $ rails server -e staging
環境ごとに違うgemを使う
たとえばdevelopmentとproductionで違うgemを利用する場合、Gemfileに以下のように記述する。
group :development, :test do gem 'sqlite3-ruby' end group :staging, :production do gem 'mysql2', '0.2.7' endbundle installする際には、以下のようにすると特定の環境で必要なgemを除外できる。
$ bundle install --without test development参考: Bundler : Using Groups