Railsのコントローラークラスでsendというメソッドを定義する
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番エラーとなると思われます。
RailsでCSV出力処理を実装する
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の出力を書くことが出来ました。
トラックバック機能を作る
トラックバック機能とは
トラックバック機能を作ってみました。
一応、そもそもトラックバック機能とはというところから説明します。
トラックバックはブログなど外部サイトから
自分を参照するときに、参照することを連絡してもらう機能です。
下のサイトがとてもわかりやすかったです。
http://www.kotono8.com/weblog/000255_trackback.html
トラックバックはあくまで強制ではなく
善意の行為として送られるものです。
Hatenaでは、hatena内でのトラックバックはデフォルトで勝手に送られていますが
基本的には自分から
「この記事すごく良かったからブログで取り上げてトラックバックも送ろう」
と思った人のみが送信してくるものだと思ってください。
ほぼ善意の行為ですね。
なお、大手のブログには
このトラックバックを送信する機能がついています。
Hateneでも詳細編集の画面にトラックバックURLを入力する画面があります。
トラックバックは、一応きちんと仕様が定められたしくみのようです。
http://lowlife.jp/yasusii/stories/8.html
上のサイトに詳しい記述が書かれています。
では、このトラックバック機能を作る場合
以下の機能が必要になります。
・記事を管理する機能
・記事にトラックバックURLを発行し表示する機能
・記事に対するトラックバックを表示する機能
・記事に対するトラックバックを許可する機能(※)
・記事に対するトラックバックを表示する機能
※は、受信したトラックバックを全て表示する場合不要
というわけで、次回よりそれぞれの機能の実装を記述していきます。
ResourceBundleでプロパティーファイルを読み込む
ResourceBundleでプロパティーファイルを読み込む
Javaでは、ResourceBundleを利用してプロパティファイルの読込を行たっりしますが
Rubyではどうやってやるのだろうと考えてしまったのはわたしだけでしょうか?
個人的な結論としては、Rubyはスクリプト言語なので
プロパティーファイルという考え方じたい間違っているのかなと。
/config
の下あたりに適当な「XxxxProperties.rb」などを作成して
これに直接定数で値を書いてしまうのが良いのかなと思っています。
Rubyなのでコンパイルもしないですし
これで充分かなと。
このクラスで定義した定数を呼びたいときには
XxxxProperties::HOGE
というように値を取り出すことができます。
エラー画面、エラー処理
エラー画面、エラー処理
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へのエラー通知や、エラーログの出力なども行うと
エラー検知の役にも立つと思います。
ページ切替用プラグインPaginateを使う
ページ切替用プラグインPaginateを使う
Rail用ページングプラグインWillPageNateを利用して
実際にページ切替機能を実装してみます。
まずはコントローラーですが
通常下記のように
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
########################################################
改行を表現する
改行を表現する
Railsでテキストフィールドなどで入力した情報は
データベースに改行コード付で格納されるようです。
しかし、これを取得して画面に表示したときに
HTMLでは改行コードを無視するので改行なしで表示されてしまいます。
例えば
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
hogehoge
hogehoge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
と登録している場合
< h2><%= @text =%>< /h2>
と記述すると
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
hogehogehogehoge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
というように表示されます。
ここで便利な機能にsimple_formatという機能があります。
下記のように記述することで、改行コードを
タグに変換してくれます。
< h2><%= simple_format @text %>< /h2>
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
hogehoge
hogehoge
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
また、クロススサイトスクリプティングを防ぐためには
下記のように記述することが推奨されるようです。
< h2><%= simple_format(h @text) %>< /h2>