2007年6月15日金曜日

テンプレートディレクトリをパラメーターで変更

コントローラ内で定義される、あるメソッドによってテンプレートディレクトリを変更します。

例えば、ユーザーの属性(性別、住地域等)によって、表示するテンプレートを切り替えたいというような場合です。

今回は、携帯用に表示を切り替えるライブラリのmobile_on_railsをベースにライブラリを作成しました。

※どうも、もう少しよいやり方があるとは思ったのですが、時間の制約上上述のライブラリを参考にさせていただきました。

それでは性別を、元にテンプレートディレクトリを切り替えるライブラリを作成します。

男性の場合はviews/man、女性の場合はviews/woman以下にコントローラ名という配置にします。

例えばmypage,openコントローラがあるケースでは
woman/mypage
woman/opne
man/mypage
man/open

という配置になります。

ライブラリはアプリケーションルート以下のlibディレクトリに配置します。

---
vi lib/sex_view.rb


class ::ActionView::Base
private

alias_method :full_template_path_without_sex, :full_template_path

def full_template_path(template_path, extension)
template = full_template_path_without_sex("#{$tag_name}/#{template_path}", extension)
#template = full_template_path_without_sex("#{$tagname}/#{@controller.action_name}", extension)
template = nil unless File.exist?(template)
template ||= full_template_path_without_sex(template_path, extension)
end
end


---

これで、書き換えの準備は整いました。

この状態でtagnameをコントローラ内で定義すると、ActionViewクラスが自動的にファイルの出力前に、テンプレートパスを書き換えてくれます。


例えば、各コントローラ内のbefore_filterなどで、性別を判定しグローバル変数に定義します。

例)


def check
if sex_value == 1
$tagname = 'man'
elsif sex_value == 2
$tagname = 'woman'
end
end


これで、準備は完了です。

この状態で、enviroment.rbにライブラリを設定し、再起動を行ってください。

vi config/enviroment.rb

> require 'sex_view'

SevenAgent,Inc

2007年5月30日水曜日

バックグラウンドでコマンド実行

railsに限らず、バックグラウンドでコマンドを実行し、その結果を受け取るようなWebプログラムはよくあると思います。

perlやphpではsystem関数を利用してコマンド実行を行いますが、rubyではopenを使用します。

今回はバックグラウンドであるディレクトリのファイルの一覧をLinuxのコマンド"ls"で取得するためのプログラムの実装例です。

---------------
list = open('|ls /home/hogehoge/') {|msg| msg.gets}

if list.nil?
message = 'ディレクトリは空です'
else
message = 'ディレクトリの内容を表示します。' + list
end

p list
---------------
注意しなくてはいけないのがopenする際に、ブロックを与えないとバックグラウンドで実行したプロセスへのpipeがクローズされないまま、ゾンビになってしまうのです。
つまり、今回の例であれば"ls /home/hogehoge"のプロセスがゾンビ状態となってしまうのです。

SevenAgent,Inc

2007年5月26日土曜日

ObserveFieldを使ってビュー表示の切り替え

リストタグやラジオボタンなどフォームの入力値によって表示内容を切り替えたいと思います。
今回はselectタグ(1)の選択時に別のselectタグ(2)の内容を変化させます。

1.Railsに標準で同胞されているprototype.jsをインクルードします。

<%= javascript_include_tag "prototype" %>

2.formタグのid,nameを指定します。
<%= start_form_tag :controller => 'store' ,:action => 'confirm',:id => 'myform' -%>

※コントローラ、アクションはそれぞれご自信の環境に合わせて変更してください。

3.非同期通信用のヘルバーを挿入
<%= observe_field (:order_type_1 ,
{:frequency => 0.5 ,
:update => 'payment_type',
:url => {:action => 'update_payment'},
:with => "order[type]"}) -%>

※frequency = 実行する秒数
 update = 更新するrhtmlの中の指定したエリアです。今回は

としています。

4.observe_fieldを実行した際に返すrhtmlの設置
 touch store/update_payment.rhtml

5.rhtmlに選択肢の取得用ヘルパーの記載

6.コントローラにメソッドを追加
vi store_controller.rb

def update_payment
@order = Order.new(params[:order])
unless params[:order].type.nil?
@consumer_type = params[:order][:type]
else
@consumer_type = nil
end
render :layout => false
end
このメソッドの中で分岐条件を書いてviewを読み出すようにしてください。


SevenAgent,Inc

2007年5月5日土曜日

Ruby で四捨五入

エクセルのRoundUP関数など、数値データの四捨五入を行う方法です。

Rubyにはエクセルのように何桁を切り捨てたり、切り上げたりする機能がないので予め切り捨てたい桁数分を少数以下にしておきます。

例えば12,229を12,000などにしたい場合はいったん12229を1000で割っておきます。

さらに小数点以下を丸めて最後に1000をかけてもとに戻せばroundupを表現できます。

例)
#!/usr/local/bin/ruby

i = 28989

i = i.to_f / 1000

p i
p i.round * 1000
p i.truncate * 1000
p i.ceil * 1000
p i.floor * 1000


# 実行結果
28.989
29000
28000
29000
28000

## 関数
round:四捨五入
truncate:切捨て
ceil:切り上げ
floor:切捨て

SevenAgent,Inc

2007年4月19日木曜日

メール受信時の環境変数RAILS_ENVの設定

サーバー側でメールを受信した際にアプリケーションを実行するプログラムを作っていると仮定します。

※問合せ管理用のWebシステムがあり、その中の一つのインターフェイスとして当プログラムが存在しているような場合です。

その際に、webアプリケーションではwebrick起動の際にdevelopmentもしくはproductionをRAILS_ENVに設定しますが、メール受信の際にはwebrickを介さずにscript/runnerでプログラムを起動するため、メールを受信したユーザーの環境変数でプログラムが実行されます。

通常はRAILS_ENVの環境変数が設定されていないので、アプリケーションを起動する際に環境変数を設定しなければなりません。

いかはpostfixでの環境変数の設定方法を例にした記述方法です。

ユーザー自身のホームディレクトリに移動し".forward"ファイルを編集します。


vi .forward

"|export RAILS_ENV=production && /usr/local/bin/ruby プログラムのパス/script/runner \"Mailman.receive(STDIN.read)\""


このexport RAILS_ENV=production &&で環境変数を設定することによりプログラムがproductionで実行されます。

qmailの場合は.qmailファイルに書くだけでよいと思います。

※試したことはありませんが、おそらくそんなに変わらないでしょう。

SevenAgent,Inc