Powered by SmartDoc

コンポーネント

他のWebページ(コンポーネント)を表示する

CGIKitではWebページ=コンポーネントです。基本的に、メソッドの戻り値にコンポーネントのオブジェクトを返すことでWebページを表示します。新しいコンポーネントオブジェクトはCKComponent#page()で取得できます。引数にはコンポーネント名を指定します。

class MainPage < CKComponent
  def do_any_action
    # 何か処理を行う

    ...

    # 次に表示するページ(コンポーネント)を生成する

    next_component = page(“NextPage“)
    return next_component
  end
end

CKHyperlinkを使ってリンクを張る

他のコンポーネントにリンクを張るだけ(実行するアクションがない)ならば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クラスの主なメソッドを示します。

CKErrorPageクラスの主なメソッド
メソッド 説明
error() 発生した例外オブジェクトを返す。
reason() エラーメッセージを返す。
backtrace() バックトレースを返す。
error_class() 発生した例外クラスを返す。

次に、アプリケーション環境設定のerror_page属性にカスタムエラーページ名を設定します。

app = CKApplication.new
app.error_page = ‘CustomErrorPage’

以上でカスタムエラーページを使うことができるようになりますが、カスタムエラーページで例外が発生した場合はデフォルトエラーページが表示されます。

コンポーネントが出力するHTMLをファイルに保存する

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属性に「jissjiseuc」のいずれかを指定します。デフォルトはnilで、文字コードを変換しない設定になっています。

他のURLにリダイレクトする

コンポーネントを表示する代わりに他の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”