RailsのControllerをフォルダ分けする
RailsのControllerをフォルダ分けする
一応書いておく程度の共有です。
ある程度の規模のシステムを開発すると
コントローラーだらけになってしまい
管理のためにもコントローラーをフォルダ分けしたいと感じます。
Railsでコントローラーをフォルダわけしたいけどどうすれば良いの?
という方も多いのではと思います。
基本的にはフォルダ分けは可能なのですが
その場合、クラス定義をちょっといじらないといけないです。
例えば
controller/hoge/hoge_controller.rb
というコントローラーを作成したい場合
class Hoge::HogeCntroller < ApplicationController
end
または
class Hoge
clssHogeCntroller < ApplicationControllerend
end
というように定義する必要があります。
なお、この時に対応するヘルパーは
helper/hoge/hoge_helper.rb
対応するVIEWは
views/layout/hoge/hoge.erb
views/hoge/hoge/xxxx.erb
となりますので、こちらも注意してください。
これによって、かなりすっきりcontrollerフォルダを管理できるのではと思います。
Webサーバ起動時のrequireのエラー
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で記述したファイルが存在しないだけのようでした。
まずはそのあたりを疑うといいと思います。
リンク用ボタンを作る
リンク用ボタンを作る
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 + "'" + ' )" >'
endreturn dscrptn
end
private
##
# param:optn オプションをHASHで渡されるとURL引数に変換する
##
def optn_uri_dscrptn( optn )dsctptn = ''
if optn == nil then
return dsctptn
endoptn.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
endreturn 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' )" >
簡単なリンクボタンになら利用できると思います。
静的なHtmlをインクルードする
静的な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
endbegin
##ファイルを開いて戻り値文字列に値を詰め込む
open( RAILS_ROOT + html ){ |io|
while line = io.gets
dscrpt = dscrpt + line + " "
end
}
rescue Errno::ENOENT
##指定ファイルが存在しない場合には空文字を返す
dscrpt = ""
endreturn dscrpt
end
基本的には、Htmlを読み込んでStringオブジェクトに詰め込み返します。
rHtml、erbの中では
<% for line in includ("/public/_header.html") %>
というように、RailsRootからの絶対パスを指定して埋め込むことで
静的なHtmlをインクルードできるようになりました。
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
########################################################
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
########################################################
複数の更新系処理を同時にCOMMITする
複数の更新系処理を同時にCOMMITする
一つのアクションの中で、複数の更新処理を行う場合があります。
ショッピングサイトでは、買い上げと同時に在庫を減らすと思います。
この時、売上が成功したのに在庫更新処理でエラーが発生すると
在庫の数が合わなくなる事態となります。
これを避けるために
RDBMSではトランザクション機能というものが存在し
COMMIT/ROLLBACKなどがこれを行うためのきのうとなります。
RailsのActiveRecordの中でこの機能を利用するには
下記のように記述します。
ActiveRecord::Base::transaction() do
##一つ目のテーブル更新
@hoge = Hoge.find(params[:id])
@hoge.upd = '1'
@hoge .save##二つ目のテーブル更新
@fuga = Fuga.find(params[:id])
@fuga.upd = '1'
@fuga.saveend
このように記述することで、例えば@hogeの更新後に@fugaの更新に失敗したときに
まとめてRollBackしてくれます。