RailsのControllerをフォルダ分けする

INDEX PAGE

RailsのControllerをフォルダ分けする


一応書いておく程度の共有です。
ある程度の規模のシステムを開発すると
コントローラーだらけになってしまい
管理のためにもコントローラーをフォルダ分けしたいと感じます。
Railsでコントローラーをフォルダわけしたいけどどうすれば良いの?
という方も多いのではと思います。


基本的にはフォルダ分けは可能なのですが
その場合、クラス定義をちょっといじらないといけないです。


例えば
 controller/hoge/hoge_controller.rb
というコントローラーを作成したい場合

class Hoge::HogeCntroller < ApplicationController

end

または

class Hoge
 clssHogeCntroller < ApplicationController

 end
end

というように定義する必要があります。

なお、この時に対応するヘルパーは
 helper/hoge/hoge_helper.rb
対応するVIEWは
 views/layout/hoge/hoge.erb
 views/hoge/hoge/xxxx.erb
となりますので、こちらも注意してください。

これによって、かなりすっきりcontrollerフォルダを管理できるのではと思います。


INDEX PAGE

Webサーバ起動時のrequireのエラー

INDEX PAGE

Webサーバ起動時のrequireのエラー



Webサーバ起動時にrequireのファイルが存在しない場合などに下記のエラーがでます。。


 ** Starting Mongrel listening at 127.0.0.1:3002
 ** Starting Rails with development environment...
Exiting
c:/ruby/lib/ruby/site_ruby/1.8/rubygems.rb:246:in `activate': can't activate rails (= 2.1.0), already activated rails-2.0.2] (Gem::Exception)
  from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:31:in `require'
  from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require'
  from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
  from c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require'
  from c:/ruby/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/commands/server.rb:39
  from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
  from c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
  from ./script/server:3
  from -e:2:in `load'
  from -e:2


これはWindows環境で、WebサーバがMongrelの場合で
Railsのバージョンを2.0.2から2.1.0にUpdateしたあとに
2.0.2に落とした状態で起動しているのですが
こんな感じのエラーが出てきました。


「can't activate rails 」とか言うので
バージョン関連のエラーかと思ってはまりましたが
requireで記述したファイルが存在しないだけのようでした。



まずはそのあたりを疑うといいと思います。

INDEX PAGE

リンク用ボタンを作る

INDEX PAGE


リンク用ボタンを作る




Rubyには日付形式の入力をサポートする各種フォームがあります。
下にまとめてみます。


機能      記述方法      備考
リンク      link_to     
イメージ      image_tag     
フォーム      form_tag     
 →テキストボックス      text_field     
 →テキストエリア      text_area     
 →パスワードボックス      password_field     
 →サブミットボタン      submit_button     
チェックボックス      check_box     
ラジオボタンン      radio_button     
リストボックス      select     
日付      date_select     


しかし、リンクボタンを簡単に実現するようなものは存在しないようです。
(存在していたらごめんなさい。)

と言うわけで、簡単なリンクボタンを実現するための関数を作成してみました。

"app/helper/application_helper.rb"に次のような関数を追加しています。

public

##
# param:name ボタン名称
# param:id  ボタンID
# param:lbl  ボタンラベル
# param:trgt 別ウィンドウにリンクする場合指定、指定なしまたは
# param:optn URLにオプションで引数を渡したい場合HASHを設定
##
def button(name, id, lbl, url , trgt = nil, optn = nil )


  dscrptn = '< input type="button" '
  dscrptn = dscrptn + 'name="' + name + '" '
  dscrptn = dscrptn + 'id="' + id + '" '
  dscrptn = dscrptn + 'value="' + lbl + '" '

  if trgt == nil then
   dscrptn = dscrptn + 'onclick="location.href=' + "'" + url + optn_uri_dscrptn(optn) + "'" + ' " >'
  else
   dscrptn = dscrptn + 'onclick="window.open( ' + "'" + url + optn_uri_dscrptn(optn) + "', '" + trgt + "'" + ' )" >'
  end

  return dscrptn

end

private

##
# param:optn オプションをHASHで渡されるとURL引数に変換する
##
def optn_uri_dscrptn( optn )

  dsctptn = ''

  if optn == nil then
    return dsctptn
  end

  optn.each do |key, vlu|
    unless vlu == nil && vlu.length < 1 then
      if dsctptn.length < 1 then
        dsctptn = dsctptn + "?" + key + '=' + vlu
      else
        dsctptn = dsctptn + "&" + key + '=' + vlu
      end
    end
  end

  return dsctptn
end

以上のような関数を利用することによって
JavaScriptとの連携でリンクボタンを実現することができました。

※実際にはこのロジックは別のモジュールに記述して
 application_helper.rbの中ではincludeを使用するほうがソースがすっきりします。

module ApplicationHelper
include HtmlButton
  ・
  ・
  ・ 


これを利用するViewのソースの中では

<%= button("button","button","yahoo","http://yahoo.co.jp") %>

このように記述すると、下記のようなHtmlタグが生成されます。

< input type="button" name="button" id="button" value="チェック" onclick="location.href='http://yahoo.co.jp' " >

また、下のように、オープンするウィンドウ及びURLのパラメーターを設定すると

<%= button("button","button","yahoo","http://yahoo.co.jp", "_blank" ,{"id" => "1"}) %>

下記のようなタグが生成されます。

< input type="button" name="button" id="button" value="チェック" onclick="window.open( 'http://yahoo.co.jp?id=1', '_blank' )" >

簡単なリンクボタンになら利用できると思います。


INDEX PAGE

静的なHtmlをインクルードする

INDEX PAGE


静的なHtmlをインクルードする


Rubyではrenderを利用すると別ファイルのrhtmlやerbをインクルードすることができます。

<%= render :partial => 'form', :locals => { :form => form} %>

このようにすることで"_form.rhtml"をこの部分にインクルードしてくれます。


しかし、静的なHtmlファイルについてはインクルードする方法が見つかりませんでした。
例えば、サイトのヘッター・フッターを表示するときなど
静的なHtmlを取り込みたく色々調べたのですが、それっぽい情報がありませんでした。


もしかしてちゃんと探せばあるのかもしれないのですが
めんどくさかったので自分で作ってしまうことにしました。


"/app/application_helper.rb"に次のようなメソッドを追加しました。

def includ( html )

  ##戻り値用文字列
  dscrpt = ""

  ##引数のパスがNIL又は空文字の場合は空文字を返す
  if html == nil || html.length < 1 then
    return ""
  end

  ##引数がファイルセパレーターで始まっていない場合は補完する
  unless html[0,1] == '/' then
    html = '/' + html
  end

  begin
   ##ファイルを開いて戻り値文字列に値を詰め込む
   open( RAILS_ROOT + html ){ |io|
    while line = io.gets
      dscrpt = dscrpt + line + " "
    end
   }
  rescue Errno::ENOENT
   ##指定ファイルが存在しない場合には空文字を返す
   dscrpt = ""
  end

  return dscrpt
end

基本的には、Htmlを読み込んでStringオブジェクトに詰め込み返します。


rHtml、erbの中では

<% for line in includ("/public/_header.html") %>

というように、RailsRootからの絶対パスを指定して埋め込むことで
静的なHtmlをインクルードできるようになりました。



INDEX PAGE

Rails用グラフプラグインGruffを使ってみる

INDEX PAGE


Rails用グラフプラグインGruffを使ってみる



Gruffの導入については前回レポートしましたが
今回は実際に使ってみることにしました。


公式HPは下記にあります。
http://nubyonrails.com/pages/gruff
また、APIは下記においてあります。
http://gruff.rubyforge.org/


しかし英語と言うことであまり英語の読めない僕は
下記のページを参考にしました。とても参考になりました。
http://d.hatena.ne.jp/onering/20080520/1211251687


というわけで、使い方はこのサイトを参考にと言いたいところですが
簡単なやつだけ。

##グラフオブジェクトの作成、
##作成するグラフによりNEWするクラスが異なります。
##後ろの700は出来上がりのピクセルです。
@grph = Gruff::Line.new 700
@grph.title = 'グラフタイトル'

##グラフスタイルの設定
theme = {
  :colors => ["#FF0000", "#0000FF"],
  :maker_color => "#999999",
  :font_color => "#000000",
  :background_colors => ["#FFDDDD","#FFFFFF"]
}
@grph.theme = theme

##フォントはRailsで利用する場合、Rails_Rootのどこかに持ってくることが推奨
@grph.font = RAILS_ROOT + '/font/msgothic.ttc'

##データの設定、データは配列で渡します、必ず数字である必要があるようです。
##Stringなどがわたってくるとエラーとなります。
@grph.data "データ", mtvtn_lvls

##データラベルの設定、ラベルはハッシュで渡します、全てのデータに設定する必要はありません。
@grph.labels = lbl


##描画処理
send_data @grph.to_blob, :type => 'imagie/png'


なお、Railsで利用する場合には、ViewのERB又はRHTMLの中から下記のように呼び出します。

< img src="<%=url_for(:controller=>'cntr',:action=>'grph')%>" >

これで、Web画面の中にグラフを表示することができます。



ただしいくつか個人的に問題点があります。
折れ線グラフにおいて、「NIL」のデータを設定すると勝手に「0」に置き換えられる。
個人的には、ないところを除いて点を結んで欲しいのですが
こういうやり方がわからないです。(それともないのかなぁ)


また、目盛りをあまりいじれないところも悩みです。
5段階評価を時系列グラフにして
5:とても良い
4:良い
3:普通
2:悪い
1:とても悪い
というように表示したかったのですが
このやり方が見つかりません。


ここは今後見つけたら報告します。


########################################################

◎Gruffの導入
 導入  http://d.hatena.ne.jp/sai-ou89/20080619
 使い方 http://d.hatena.ne.jp/sai-ou89/20080620

########################################################



INDEX PAGE

Rails用グラフプラグインGruffの導入

INDEX PAGE


Rails用グラフプラグインGruffの導入



Railsでグラフを表示したくなりGruff用のプラグインを入れることにしました。
Ruby On RailsによるWebアプリケーションスーパーサンプル(http://www.amazon.co.jp/dp/4797341882)
を読んだところ、「Gruff」というライブラリーがよさそうだったので
こちらを導入してみました。


工程は大きく分けてこんな感じです。
「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「「
■ImagieMagickをインストール(インストーラー)

RMagicをインストール(gem)

■Gruffをインストール(gem)
」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」」


Gruffはグラフ画像を作成するライブラリですが
画像を作成する機能はImagieMagickというプログラムに依存しており
また、このプログラムのRuby用のインターフェイスRMagicのようです。


なお、導入した環境は以下の通り

「「「「導入バージョン「「「「「「「「「「「「「「「
OS WindowsVista
開発環境 pleiades-all-in-one-ruby + RadRails
Ruby 1.8.6
Ruby On Rails 2.1.0
ImagieMagick 6.4.1-5
RMagic 2.5.0
Gruff 0.3.1
」」」」」」」」」」」」」」」」」」」」」」」」」」」


■ImagieMagickをインストール
 下記のURLより取得が可能です。
 http://rubyforge.org/frs/?group_id=12
 開発環境がWindowsなので"RMagick-2.5.0-ImageMagick-6.4.1-5-Q8.zip"を利用しました。

 ダウンロードしたZIPを解凍して、中の
  ImageMagick-6.4.1-5-Q8-windows-dll.exe
 を実行しました。
 インストールウィザードが開き色々聞かれましたが、
 基本的に全てOKでいけます。


RMagicをインストール
 コマンドプロンプトで、"RMagick-2.5.0-ImageMagick-6.4.1-5-Q8.zip"にディレクトリ移動します。
 その後ここでコマンドプロンプトより下記のようにgemを実行します。

C:\(解凍フォルダ)>gem install rmagick --local
Successfully installed rmagick, version 2.5.0

 これでRmagicのインストールは完了です。


■Gurffをインストール
 こちらもgemを利用してインストールします。
 コマンドプロンプトから下記のように入力してインストールします。

C:\(適当な場所)>gem install gruff
Successfully installed gruff-0.3.1
Installing ri documentation for gruff-0.3.1...
Installing RDoc documentation for gruff-0.3.1...

 

以上でインストール作業は完了ですした。
なお、Eclipseを利用している場合、Eclipseを再起動しないとうまくライブラリを呼び出せませんので注意ください。
次回Gruffの使い方についてレポートします。


########################################################

◎Gruffの導入
 導入  http://d.hatena.ne.jp/sai-ou89/20080619
 使い方 http://d.hatena.ne.jp/sai-ou89/20080620

########################################################


INDEX PAGE

複数の更新系処理を同時にCOMMITする

INDEX PAGE

複数の更新系処理を同時にCOMMITする


一つのアクションの中で、複数の更新処理を行う場合があります。
ショッピングサイトでは、買い上げと同時に在庫を減らすと思います。
この時、売上が成功したのに在庫更新処理でエラーが発生すると
在庫の数が合わなくなる事態となります。

これを避けるために
RDBMSではトランザクション機能というものが存在し
COMMIT/ROLLBACKなどがこれを行うためのきのうとなります。

RailsActiveRecordの中でこの機能を利用するには
下記のように記述します。

ActiveRecord::Base::transaction() do

  ##一つ目のテーブル更新
  @hoge = Hoge.find(params[:id])
  @hoge.upd = '1'
  @hoge .save

  ##二つ目のテーブル更新
  @fuga = Fuga.find(params[:id])
  @fuga.upd = '1'
  @fuga.save

end

このように記述することで、例えば@hogeの更新後に@fugaの更新に失敗したときに
まとめてRollBackしてくれます。

INDEX PAGE