Class: AlController

Inherits:
Object
  • Object
show all
Defined in:
lib/al_controller.rb,
lib/al_mif.rb

Overview

Aloneコントローラクラス

コントローラ名、ステート名、アクション名、この3つのパラメータにより、 全体を駆動する。 コントローラは、パラメータ ctrl= で、アクションは、action= で指定される。 ただし、これらパラメータのパースはメインモジュールにて行い、ここでは、 その値のエイリアスをもらっている。 併せて、(ちょっとした工夫により)コントローラごとに名前空間分離した 専用セッション変数を持たせる機能もインプリメントしてある。

Defined Under Namespace

Classes: AlControllerSession

Constant Summary

CTRL =

コントローラ名(メインモジュールの値のエイリアス)

Alone::ctrl
@@state =

ステート

AlSession["AL_STATE_#{CTRL}"].to_s
@@action =

アクション名(メインモジュールの値のエイリアス)

Alone::action
@@respond_to =

動作選出されたメソッド名

""
@@session =

コントローラローカルのセッション変数

AlControllerSession.new
@@flag_raise_state_error =

ステートエラー時に、ランタイムエラーを起こすかのフラグ

false

Class Method Summary (collapse)

Instance Method Summary (collapse)

Class Method Details

+ (String) debug_dump

デバグ用:各パラメータの表示用文字列を返す

Returns:

  • (String)

    デバグ用文字列



185
186
187
188
189
190
191
192
193
194
195
# File 'lib/al_controller.rb', line 185

def self.debug_dump()
  r = "CTRL: #{CTRL}, STATE: #{@@state}, ACTION: #{@@action}, RESPOND TO: #{@@respond_to}\n"
  r << "SESSION VAR:\n"
  prefix = "AL_#{CTRL}_"
  AlSession::keys().each do |k|
    if k.to_s.index( prefix ) == 0
      r << "  #{k.to_s[prefix.size,100]}: #{AlSession[k]}\n"
    end
  end
  return r
end

Instance Method Details

- (Object) _exec

Note:

各パラメータによりユーザコードを選択し、実行する。

アプリケーション実行開始(内部メソッド)



115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
# File 'lib/al_controller.rb', line 115

def _exec()
  if @@action == ""
    @@action = 'index'
  end

  @@respond_to = "from_#{@@state}_action_#{@@action}"
  if respond_to?( @@respond_to )
    return __send__( @@respond_to )
  end

  @@respond_to = "state_#{@@state}_action_#{@@action}"
  if respond_to?( @@respond_to )
    return __send__( @@respond_to )
  end

  @@respond_to = "action_#{@@action}"
  if respond_to?( @@respond_to )
    return __send__( @@respond_to )
  end

  @@respond_to = "state_#{@@state}"
  if respond_to?( @@respond_to )
    return __send__( @@respond_to )
  end

  # 実行すべきメソッドが見つからない場合
  @@respond_to = ""
  no_method_error()
end

- (Object) action_create

(MIF) 新規登録 フォーム表示アクション



80
81
82
83
84
85
# File 'lib/al_mif.rb', line 80

def action_create()
  delete_foreign_widget()
  @form.action = Alone::make_uri( :action=>'create_submit' )

  AlTemplate.run( @template_create || "#{AL_BASEDIR}/templates/form.rhtml" )
end

- (Object) action_create_submit

(MIF) 新規登録 確定アクション



91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/al_mif.rb', line 91

def action_create_submit()
  delete_foreign_widget()

  if ! @form.validate()
    # バリデーションエラーならフォームへ戻す
    AlTemplate.run( @template_create || "#{AL_BASEDIR}/templates/form.rhtml" )
    return
  end

  @result = @persist.create( @form.values )
  AlTemplate.run( @template_create_submit || "#{AL_BASEDIR}/templates/form_submit.rhtml" )

  if @@session[:al_search_condition]
    @@session[:al_search_condition].delete( :total_rows )
  end
end

- (Object) action_delete

(MIF) 削除 確認画面表示アクション



147
148
149
150
151
152
153
# File 'lib/al_mif.rb', line 147

def action_delete()
  raise "Primary key is not given."  if ! @form.validate( @persist.pkeys )
  raise "Read error. #{@form.values}"  if ! @persist.read( @form.values )
  @form.values = @persist.values

  AlTemplate.run( @template_delete || "#{AL_BASEDIR}/templates/delete.rhtml" )
end

- (Object) action_delete_submit

(MIF) 削除 確定アクション



159
160
161
162
163
164
165
166
167
168
# File 'lib/al_mif.rb', line 159

def action_delete_submit()
  raise "Primary key is not given."  if ! @form.validate( @persist.pkeys )

  @result = @persist.delete( @form.values )
  AlTemplate.run( @template_delete_submit || "#{AL_BASEDIR}/templates/delete_submit.rhtml" )

  if @@session[:al_search_condition]
    @@session[:al_search_condition].delete( :total_rows )
  end
end

- (Object) action_list

(MIF) 一覧表示アクション



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
# File 'lib/al_mif.rb', line 48

def action_list()
  # 検索条件の調整
  sc = @@session[:al_search_condition] || {}
  sc.merge!( @search_condition )  if @search_condition
  sc[:limit] ||= 25
  sc[:order_by] ||= @persist.pkeys()

  form = AlForm.new([ AlInteger.new( 'offset' ) ])
  form.validate()
  sc[:offset] = form[:offset].to_i

  # データの取得
  @datas = @persist.search( sc )

  # 表示用カラム配列作成
  @columns = []
  @form.widgets.each do |k,w|
    next if w.class == AlHidden || w.class == AlSubmit || w.class == AlPassword || w.
    @columns << k
  end

  # 表示開始
  AlTemplate.run( @template_list || "#{AL_BASEDIR}/templates/list.rhtml" )

  # 検索条件を保存
  @@session[:al_search_condition] = @persist.search_condition
end

- (Object) action_update

(MIF) 更新 フォーム表示アクション



112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# File 'lib/al_mif.rb', line 112

def action_update()
  raise "Primary key is not given."  if ! @form.validate( @persist.pkeys )
  raise "Read error. #{@form.values}"  if ! @persist.read( @form.values )
  @form.values = @persist.values

  # フォームの調整
  # プライマリキーとなるウィジェットを変更不可にする
  @persist.pkeys.each do |k|
    @form.widgets[k].set_attr( :readonly=>'readonly' )
  end
  @form.action = Alone::make_uri( :action=>'update_submit' )

  # 表示開始
  AlTemplate.run( @template_update || "#{AL_BASEDIR}/templates/form.rhtml" )
end

- (Object) action_update_submit

(MIF) 更新 確定アクション



132
133
134
135
136
137
138
139
140
141
# File 'lib/al_mif.rb', line 132

def action_update_submit()
  if ! @form.validate()
    # バリデーションエラーならフォームへ戻す
    AlTemplate.run( @template_update || "#{AL_BASEDIR}/templates/form.rhtml" )
    return
  end

  @result = @persist.update( @form.values )
  AlTemplate.run( @template_update_submit || "#{AL_BASEDIR}/templates/form_submit.rhtml" )
end

- (String) make_uri_key(persist, arg = {})

(MIF) リンク用のURIをキーを含めて生成する

Parameters:

  • (AlPersist) persist

    AlPersistオブジェクト

  • (Hash<String>) arg (defaults to: {})

    URIに含めるパラメータ

Returns:

  • (String)

    生成したURI



36
37
38
39
40
41
42
# File 'lib/al_mif.rb', line 36

def make_uri_key( persist, arg = {} )
  r = Alone::make_uri( arg )
  @persist.pkeys.each do |k|
    r << "&#{k}=#{Alone::encode_uri_component(persist[k])}"
  end
  return r
end

- (Object) no_method_error

Note:

ステートエラーは、raise_state_error()で動作を本番時とデバッグ時を切り替えられる。 エラー表示などしたければ、当メソッドをオーバライドすることもできる。

メソッドエラーの場合のエラーハンドラ



153
154
155
156
157
158
159
160
161
162
163
164
165
# File 'lib/al_controller.rb', line 153

def no_method_error()
  if @@state.empty?
    Alone::add_http_header( "Status: 404 Not Found" )
    raise "No action defined. CTRL: #{CTRL}, ACTION: #{@@action}"
  end

  if @@flag_raise_state_error
    Alone::add_http_header( "Status: 404 Not Found" )
    raise "No state/action defined. CTRL: #{CTRL}, STATE: #{@@state}, ACTION: #{@@action}"
  end

  Alone::add_http_header( "Status: 204 No Content" )
end

- (Object) raise_state_error(flag = true)

ステートエラー発生の制御



104
105
106
# File 'lib/al_controller.rb', line 104

def raise_state_error( flag = true )
  @@flag_raise_state_error = flag
end

- (AlControllerSession) session

getter: session

Returns:

  • (AlControllerSession)

    コントローラローカルセッションの操作オブジェクト



96
97
98
# File 'lib/al_controller.rb', line 96

def session()
  return @@session
end

- (Object) set_state(state) Also known as: state=

現在のステートを宣言する

Parameters:

  • (String) state

    ステート文字列



173
174
175
176
# File 'lib/al_controller.rb', line 173

def set_state( state )
  @@state = state.to_s
  AlSession["AL_STATE_#{CTRL}"] = @@state
end