Railsのコントローラークラスでsendというメソッドを定義する

INDEX PAGE

Railsのコントローラークラスでsendというメソッドを定義する


Railsにおいて、コントローラーにsendというメソッドを定義すると
下記のようなエラーが発生します。

/!\ FAILSAFE /!\ Wed Jul 30 21:51:33 +0900 2008
 Status: 500 Internal Server Error
 wrong number of arguments (1 for 0)
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:524:in `send'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:524:in `process_without_filters'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/filters.rb:685:in `process_without_session_management_support'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/session_management.rb:123:in `process'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/base.rb:388:in `process'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:171:in `handle_request'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:115:in `dispatch'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:126:in `dispatch_cgi'
  c:/ruby/lib/ruby/gems/1.8/gems/actionpack-2.0.2/lib/action_controller/dispatcher.rb:9:in `dispatch'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/bin/../lib/mongrel/rails.rb:76:in `process'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/bin/../lib/mongrel/rails.rb:74:in `synchronize'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/bin/../lib/mongrel/rails.rb:74:in `process'
 c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:159:in `process_client'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:158:in `each'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:158:in `process_client'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:285:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:285:in `initialize'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:285:in `new'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:285:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:268:in `initialize'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:268:in `new'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel.rb:268:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel/configurator.rb:282:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel/configurator.rb:281:in `each'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel/configurator.rb:281:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/bin/mongrel_rails:128:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/lib/mongrel/command.rb:212:in `run'
  c:/ruby/lib/ruby/gems/1.8/gems/mongrel-1.1.4-x86-mswin32-60/bin/mongrel_rails:281
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:489:in `load'
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:489:in `load'
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:489:in `load'
  c:/ruby/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/commands/servers/mongrel.rb:64
  c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
  c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require'
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:342:in `new_constants_in'
  c:/ruby/lib/ruby/gems/1.8/gems/activesupport-2.0.2/lib/active_support/dependencies.rb:496:in `require'
  c:/ruby/lib/ruby/gems/1.8/gems/rails-2.0.2/lib/commands/server.rb:39
  c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'
  c:/ruby/lib/ruby/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'
  ./script/server:3
  -e:2:in `load'
  -e:2

500番エラーは様々な状況で発生するのでこの原因だけとは限らないですが
一つの原因の有力候補です。

send以外にもたぶん禁止されているメソッド名がいくつかあるのだと思われます。
そのときにも、同様に500番エラーとなると思われます。



INDEX PAGE

RailsでCSV出力処理を実装する

INDEX PAGE

RailsCSV出力処理を実装する


Railsでデータのエクスポート処理を作ろうとして
CSVの出力共通関数を作ろうとしたのですが
Railsには既に便利なCSV出力機能が備わっていました。


CSV::Writerというライブラリを利用すると便利です。
http://www.sakalab.org/prog-ruby/ruby-man-html-20080121/CSV_Writer.html


使い方は、まずrequireでcsvライブラリを記述します。

require 'csv'

続いて、実際にファイルの生成と、
生成したファイルをリプライする方法ですが、こんな感じです。

class hoge
 def exprt
 
  ##データベースからの検索処理
  hoges = Hoge.find(:all)

  ##出力ファイルのコンテンツタイプの決定
  cntnt_type = ""

  if request.user_agent =~ /windows/i then
   ##クライアント環境がWindowsの場合はExcel形式で返す
   cntnt_type = "application/vnd.ms-excel"
  else
   ##それ以外の場合にはCSV形式で返す
   cntnt_type = "text/csv"
  end

  ##ファイル名称の設定
  file_name = "hoge.csv"

  ##CSVオブジェクトを生成し、データをセットしていく
  CSV::Writer.generate(output = "") do |csv|
   for hoge in hoges
    csv << [hoge.hoge ,hoge.fuga ]
   end
  end

  ##CSVファイルの出力
  send_data(output, :type => cntnt_type, :filename => file_name)
end


これでかなり簡単にCSVの出力を書くことが出来ました。


INDEX PAGE

トラックバック機能を作る

INDEX PAGE

トラックバック機能とは


トラックバック機能を作ってみました。
一応、そもそもトラックバック機能とはというところから説明します。


トラックバックはブログなど外部サイトから
自分を参照するときに、参照することを連絡してもらう機能です。
下のサイトがとてもわかりやすかったです。
http://www.kotono8.com/weblog/000255_trackback.html


トラックバックはあくまで強制ではなく
善意の行為として送られるものです。
Hatenaでは、hatena内でのトラックバックはデフォルトで勝手に送られていますが
基本的には自分から
「この記事すごく良かったからブログで取り上げてトラックバックも送ろう」
と思った人のみが送信してくるものだと思ってください。
ほぼ善意の行為ですね。


なお、大手のブログには
このトラックバックを送信する機能がついています。
Hateneでも詳細編集の画面にトラックバックURLを入力する画面があります。


トラックバックは、一応きちんと仕様が定められたしくみのようです。
http://lowlife.jp/yasusii/stories/8.html
上のサイトに詳しい記述が書かれています。


では、このトラックバック機能を作る場合
以下の機能が必要になります。
・記事を管理する機能
・記事にトラックバックURLを発行し表示する機能
・記事に対するトラックバックを表示する機能
・記事に対するトラックバックを許可する機能(※)
・記事に対するトラックバックを表示する機能
※は、受信したトラックバックを全て表示する場合不要


というわけで、次回よりそれぞれの機能の実装を記述していきます。


INDEX PAGE

ResourceBundleでプロパティーファイルを読み込む

INDEX PAGE


ResourceBundleでプロパティーファイルを読み込む



Javaでは、ResourceBundleを利用してプロパティファイルの読込を行たっりしますが
Rubyではどうやってやるのだろうと考えてしまったのはわたしだけでしょうか?

個人的な結論としては、Rubyスクリプト言語なので
プロパティーファイルという考え方じたい間違っているのかなと。

/config

の下あたりに適当な「XxxxProperties.rb」などを作成して
これに直接定数で値を書いてしまうのが良いのかなと思っています。
Rubyなのでコンパイルもしないですし
これで充分かなと。


このクラスで定義した定数を呼びたいときには

XxxxProperties::HOGE

というように値を取り出すことができます。

INDEX PAGE

エラー画面、エラー処理

INDEX PAGE

エラー画面、エラー処理


Webアプリ上でエラーが発生した場合の処理方法ですが
例えばJsp/Servletの場合には、エラーを呼び出し元にスローしていき
最終的に一番呼び出しもとのプログラムで例外をキャッチし
エラー画面にリダイレクトするという流れとなると思います。

Railsの場合には、基本的にそんな面倒なことはしなくても
ApplicationControllerの中で下記のように書くだけでエラーページが実装されます。

def rescue_action( excptn )
 redirect_to :action => 'error', :controller => '/error'
end

Rubyでは、基本的に例外やエラーは上に上がっていくので
Javaのようにthrowを書かなくても
処理されなかった例外は全てこの「rescue_action」で拾ってくれます。


そして、レスキューアクションの中でエラー画面にリダイレクトすれば
エラー画面が完成しました。


「rescue_action」では、引数としてエラークラスを拾うので
このオブジェクトの方を判定して、エラー処理を行うことも可能です。

def rescue_action( excptn )
 case excptn
  when StandardError
   puts "想定内のエラー"
  else
   puts "想定外のエラー"
 end
 
 redirect_to :action => 'error', :controller => '/error'
end


実際にはこの箇所で
Syslogへのエラー通知や、エラーログの出力なども行うと
エラー検知の役にも立つと思います。


INDEX PAGE

ページ切替用プラグインPaginateを使う

INDEX PAGE


ページ切替用プラグインPaginateを使う



Rail用ページングプラグインWillPageNateを利用して
実際にページ切替機能を実装してみます。


まずはコントローラーですが
通常下記のように

@hoge = Hoge.find(:all)

ActiveRecordのfindを利用する箇所を、pagenateで書き換えます。

@hoge = Hoge.paginate(:page => params[:page], :per_page => 10)

オプション及びデフォルト値は、次のようになっているようです。

設定内容 パラメーター名 デフォルト値
モデルのクラス名 class_name nil
単一形→複数形の推測が出来ないモデルの場合にそれぞれの名前を指定する。 singular_name nil
一ページの表示件数 per_page 10
where句 conditions nil
order by句 order_by nil
調査中 order nil
join句 join nil
join句? joins nil
カウントするカラム? count nil
調査中 include nil
Select文の指定 select nil
ページング用パラメータークラス parameter 'page'

※調査中のところご存知の方居たら教えてください。


という形でしていできるようです。

なお、erb側には次のように記述します。

< table>
< tr>
< td>A列< /td>
< td>B列< /td>
< /tr>
<% for hoge in @hoge %>
< tr>
< td><%= h hoge.a %>< /td>
< td><%= h hoge.b %>< /td>
< /tr>
<% end %>< /table>

<%= will_paginate(@hoge) %>

昔のPagenationだと、ページ切替部の表示/非表示は
IF文とか書かないといけなかったので
かなりキレイにかけるようになりました。

########################################################
◎WillPaginateの導入
 導入  http://d.hatena.ne.jp/sai-ou89/20080525
 使い方 http://d.hatena.ne.jp/sai-ou89/20080716
########################################################


INDEX PAGE

改行を表現する

INDEX PAGE


改行を表現する



Railsでテキストフィールドなどで入力した情報は
データベースに改行コード付で格納されるようです。

しかし、これを取得して画面に表示したときに
HTMLでは改行コードを無視するので改行なしで表示されてしまいます。


例えば

                                                                  • -

hogehoge
hogehoge

                                                                  • -

と登録している場合

< h2><%= @text =%>< /h2>


と記述すると

                                                                  • -

hogehogehogehoge

                                                                  • -

というように表示されます。


ここで便利な機能にsimple_formatという機能があります。
下記のように記述することで、改行コードを
タグに変換してくれます。

< h2><%= simple_format @text %>< /h2>

                                                                  • -

hogehoge
hogehoge

                                                                  • -

また、クロススサイトスクリプティングを防ぐためには
下記のように記述することが推奨されるようです。

< h2><%= simple_format(h @text) %>< /h2>


INDEX PAGE