CGIKitではWebページ=コンポーネントです。基本的に、メソッドの戻り値にコンポーネントのオブジェクトを返すことでWebページを表示します。新しいコンポーネントオブジェクトはCKComponent#page()
で取得できます。引数にはコンポーネント名を指定します。
class MainPage < CKComponent def do_any_action # 何か処理を行う ... # 次に表示するページ(コンポーネント)を生成する next_component = page(“NextPage“) return next_component end end
他のコンポーネントにリンクを張るだけ(実行するアクションがない)ならばCKHyperlinkエレメントを使います。エレメントのpage
属性にリンクするコンポーネント名を設定してください。
Link : CKHyperlink { page = “OtherPage”; }
「フォームから入力されたデータを処理し、次のページで入力したデータの確認を行う」など、他のコンポーネントに必要なデータを渡さなければならないことがあります。このようなときはデータを渡すコンポーネントにアクセサを定義しておき、そのアクセサを使ってデータを設定します。
例として、MainPage
コンポーネントでユーザーの名前を入力し、HelloPage
コンポーネントでその名前を表示するアプリケーションを考えます。MainPage
にはユーザー名を入力するためのテキストフィールドがあり、インスタンス変数user_name
にデータが代入されるものとします。
HelloPage
ではMaiPage
で入力されたユーザー名を表示します。MainPage
からデータを受け取るためのアクセサuser_name
を定義します。
class HelloPage < CKComponent attr_accessor :user_name end
MainPage
では入力されたユーザー名をHelloPage
に渡します。
class MainPage < CKComponent def set_user_name_to_hellopage # HelloPageを生成し、ユーザー名を渡す hellopage = page(“HelloPage”) hellopage.user_name = @user_name # HelloPageを表示する return hellopage end end
CKComponent
クラスでは専用の初期化メソッドinit()
が用意されています。初期化をするにはinitialize()
ではなくinit()
をオーバーライドします。
init()
の実行時、フォームデータはまだコンポーネントに代入されていません。エレメントにバインディングした変数を使おうとしてもデータが代入されていませんので注意して下さい。変数にデータが代入された状態での初期化はpre_action()
メソッドをオーバーライドして記述します。
アクション実行前後に処理を行うにはCKComponent#pre_action()
、post_action()
メソッドをオーバーライドします。これらのフックメソッドはそれぞれアクション実行前、実行後に呼ばれます。特定のアクションではなく、どのアクションに対しても呼ばれることに注意してください。またpre_action()が呼ばれるときには、フォームデータはバインディングファイルの設定通りに代入されています。
アプリケーションで例外が発生するとCGIKitのデフォルトエラーページ(CKErrorPage
)が表示されますが、アプリケーション専用のエラーページを作成することもできます。カスタムエラーページを作成・設定すると、例外が発生したときデフォルトエラーページの代わりに使われるようになります。
カカスタムエラーページはCKErrorPage
のサブクラスになります。それ以外は普通のコンポーネントと同じように作成します。
class CustomErrorPage < CKErrorPage end
以下にCKErrorPage
クラスの主なメソッドを示します。
メソッド | 説明 |
---|---|
error() |
発生した例外オブジェクトを返す。 |
reason() |
エラーメッセージを返す。 |
backtrace() |
バックトレースを返す。 |
error_class() |
発生した例外クラスを返す。 |
次に、アプリケーション環境設定のerror_page
属性にカスタムエラーページ名を設定します。
app = CKApplication.new app.error_page = ‘CustomErrorPage’
以上でカスタムエラーページを使うことができるようになりますが、カスタムエラーページで例外が発生した場合はデフォルトエラーページが表示されます。
CGIの負荷を軽減するためなど、表示されるHTMLをファイルに保存しておくにはCKComponent#to_s()
を使います。このメソッドはコンポーネントをHTMLに変換した文字列を返します。
class MainPage < CKComponent def save_to_file( filename ) open(filename, ‘w+’) do |f| f.write to_s() end end end
CGIKitはフォームデータの文字コードを自動的に変換してからコンポーネントに代入します。文字コードを設定するには、アプリケーション環境設定のchar_code
属性に「jis
、sjis
、euc」のいずれかを
指定します。デフォルトはnil
で、文字コードを変換しない設定になっています。
コンポーネントを表示する代わりに他のURLへリダイレクトするには、CKResponse#set_redirect()
でリダイレクト先のURLを設定します。リダイレクト先を設定すると、コンポーネントを返す・返さないに関わらず指定したURLにリダイレクトされます。
class MainPage < CKComponent def redirect # リダイレクト先を設定 response.set_redirect(‘http://www.ruby-lang.org/’) # コンポーネントを返しても上記のURLにリダイレクトされる nextpage = page(‘NextPage’) return nextpage end end
アプリケーション環境設定のmain
属性を使うと、アプリケーションに最初にアクセスしたときに表示するコンポーネントを変更することができます。デフォルトではMainPage
コンポーネントに設定されています。
次にコンポーネントをOtherPage
に変更するコードを示します。こうすると、最初にアプリケーションにアクセスしたときにMainPage
ではなくOtherPage
が表示されるようになります。
app = CKApplication.new app.main = “OtherPage”