Showing posts with label rails. Show all posts
Showing posts with label rails. Show all posts

Wednesday, September 19, 2012

Rails3のviewで、JavascriptのオブジェクトにRubyのオブジェクトをjson(など)で渡す

Rails3のview(erb)で、Rubyのオブジェクトをto_jsonしたものをJavascriptの変数に設定する際は、html_safeメソッドを使う。
var json = <%= {:foo => "FOO"}.to_json.html_safe %>;

Sunday, April 08, 2012

Rails3でscaffoldのテンプレートをカスタマイズ

Rails3ではscaffoldなどで生成するテンプレートをカスタマイズできる。まず、自動生成するコードの元になるテンプレートを、以下のコマンドでlib/templatesに作成する。
$ 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という環境を新規に追加するには、以下の作業をする。

  1. RAILS_HOME/config/environmentsにあるproduction.rbをstaging.rbにコピーする
  2. database.ymlにstagingの項目を追加する
もちろんその他に環境依存の設定ファイルなどがあれば、そちらにもstagingを追加する。これで例えば以下のようにすればstagingの設定でrailsを起動できる。
$ 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'
end
bundle installする際には、以下のようにすると特定の環境で必要なgemを除外できる。
$ bundle install --without test development
参考: Bundler : Using Groups