Class: AlControllerBase

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

Overview

Aloneコントローラクラス

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

Direct Known Subclasses

AlController

Defined Under Namespace

Classes: AlControllerSession

Constant Summary

CTRL =

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

Alone::ctrl

Instance Attribute Summary (collapse)

Class Method Summary (collapse)

Instance Method Summary (collapse)

Instance Attribute Details

- (Bool) flag_raise_state_error (readonly)

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

Returns:

  • (Bool)

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



82
83
84
# File 'lib/al_controller.rb', line 82

def flag_raise_state_error
  @flag_raise_state_error
end

- (String) respond_to (readonly)

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

Returns:

  • (String)

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



79
80
81
# File 'lib/al_controller.rb', line 79

def respond_to
  @respond_to
end

- (String) state (readonly)

Returns ステート

Returns:

  • (String)

    ステート



76
77
78
# File 'lib/al_controller.rb', line 76

def state
  @state
end

Class Method Details

+ (String) debug_dump

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

Returns:

  • (String)

    デバグ用文字列



193
194
195
196
197
198
199
200
201
202
203
# File 'lib/al_controller.rb', line 193

def self.debug_dump()
  r = "CTRL: #{CTRL}, STATE: #{$AlController.state}, ACTION: #{Alone::action}, RESPOND TO: #{$AlController.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:

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

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



121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
# File 'lib/al_controller.rb', line 121

def _exec()
# アクション名(メインモジュールの値のエイリアス)
  action = Alone::action
  if action.empty?
    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) 新規登録 フォーム表示アクション



111
112
113
114
115
116
# File 'lib/al_mif.rb', line 111

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) 新規登録 確定アクション



122
123
124
125
126
127
128
129
130
131
132
133
134
# File 'lib/al_mif.rb', line 122

def action_create_submit()
  delete_foreign_widget()

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

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

- (Object) action_delete

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



176
177
178
179
180
181
182
# File 'lib/al_mif.rb', line 176

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

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

- (Object) action_delete_submit

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



188
189
190
191
192
193
194
# File 'lib/al_mif.rb', line 188

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

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

- (Object) action_list

Note:

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

ブラウザから渡されるパラメータとして、以下の3つを使用する。

total_rows
offset
order_by


67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
# File 'lib/al_mif.rb', line 67

def action_list()
  # 検索条件の取得および調整
  form_search_condition = AlForm.new( 
      AlInteger.new( "total_rows", :min=>0 ),
      AlInteger.new( "offset", :min=>0 ),
      AlText.new( "order_by", :validator=>/\A[\w ]+\z/ ) )

  @search_condition ||= {}
  if form_search_condition.validate()
    if @search_condition[:total_rows] && form_search_condition[:total_rows]
      @search_condition[:total_rows] = form_search_condition[:total_rows].to_i
    end
    @search_condition[:offset] ||= form_search_condition[:offset].to_i
    if ! form_search_condition[:order_by].empty?
      @search_condition[:order_by] ||= form_search_condition[:order_by]
    end
  end
  @search_condition[:limit] ||= 20
  @search_condition[:order_by] ||= @persist.pkeys()

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

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

  # 次のリクエストURI生成用インスタンス変数@requestを作る
  @request = AlForm.request_get
  if @persist.search_condition[:total_rows]
    @request[:total_rows] = @persist.search_condition[:total_rows]
  end

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

- (Object) action_update

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



140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
# File 'lib/al_mif.rb', line 140

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

  # フォームの調整
  # プライマリキーとなるウィジェットを変更不可にする
  @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) 更新 確定アクション



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

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

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

- (Object) log(arg = nil, severity = nil, progname = nil)

ログ出力

See Also:

  • Alone.log()


100
101
102
# File 'lib/al_controller.rb', line 100

def log( arg = nil, severity = nil, progname = nil )
  Alone.log( arg, severity, progname )
end

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

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

Parameters:

  • persist (AlPersist)

    AlPersistオブジェクト

  • arg (Hash<String>) (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 = {} )
  uri = Alone::make_uri( arg )
  persist.pkeys.each do |k|
    uri << "&#{k}=#{Alone::encode_uri_component(persist[k])}"
  end
  return uri
end

- (Object) no_method_error

Note:

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

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



161
162
163
164
165
166
167
168
169
170
171
172
173
# File 'lib/al_controller.rb', line 161

def no_method_error()
  if @state.to_s.empty?
    Alone::add_http_header( "Status: 404 Not Found" )
    raise "No action defined. CTRL: #{CTRL}, ACTION: #{Alone::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: #{Alone::action}"
  end

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

- (String) param_order_by(key)

Note:

(MIF) 並べ替え用文字列生成

並べ替えを順序 (order by xxx asc|desc) をトグル動作とする為に、引数で渡したカラム名を加工する。

Parameters:

  • key (String)

    並べ替えする項目

Returns:

  • (String)

    加工後



53
54
55
# File 'lib/al_mif.rb', line 53

def param_order_by( key )
  return @request[:order_by] == key ? "#{key} desc" : key
end

- (Object) raise_state_error(flag = true)

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

Parameters:

  • flag (Bool) (defaults to: true)

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



110
111
112
# File 'lib/al_controller.rb', line 110

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

- (AlControllerSession) session

getter: session

Returns:

  • (AlControllerSession)

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



90
91
92
# File 'lib/al_controller.rb', line 90

def session()
  return AlControllerSession
end

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

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

Parameters:

  • state (String)

    ステート文字列



181
182
183
184
# File 'lib/al_controller.rb', line 181

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