Class: AlForm
- Inherits:
-
Object
- Object
- AlForm
- Defined in:
- lib/al_form.rb,
lib/al_form/generate_form_template.rb,
lib/al_form/generate_list_template.rb,
lib/al_form/generate_sheet_template.rb,
lib/al_form/generate_sql_table.rb,
lib/al_form/make_tiny_form.rb,
lib/al_form/make_tiny_sheet.rb,
lib/al_form/multipart.rb
Overview
フォームクラス
htmlフォームからの送信を受け取り、ユーザーアプリケーションへ渡す。
Defined Under Namespace
Classes: UploadedFile
Constant Summary collapse
- FILTER_STRIP =
:filter用、前後空文字削除フィルター
lambda { |s| s.strip!; s }
- METHOD_LIST =
ダイナミックローディングメソッド名テーブル
{ :make_tiny_form=>"al_form/make_tiny_form", :make_tiny_form_main=>"al_form/make_tiny_form", :make_tiny_sheet=>"al_form/make_tiny_sheet", :generate_form_template=>"al_form/generate_form_template", :generate_sheet_template=>"al_form/generate_sheet_template", :generate_list_template=>"al_form/generate_list_template", :generate_sql_table=>"al_form/generate_sql_table", }
- @@request_get =
- Hash
-
GETリクエストを解析してHash化した値のキャッシュ
{}
- @@request_post =
- Hash
-
POSTリクエストを解析してHash化した値のキャッシュ
{}
- @@flag_request_oversize =
- Boolean
-
リクエストサイズ過大エラーフラグ
false
Instance Attribute Summary collapse
-
#action ⇒ String
HTMLフォームのactionアトリビュート.
-
#flag_setvalue_done ⇒ Boolean
値のセットが終わっているかのフラグ(バリデーション前).
-
#method ⇒ String
HTMLフォームのmethodアトリビュート “GET” or “POST”.
-
#tag_attr ⇒ Hash
HTMLタグ生成時の追加アトリビュート.
-
#validation_messages ⇒ Hash
readonly
バリデーションメッセージ。キーがウィジェット名のシンボル、値がメッセージ文字列.
-
#values ⇒ Hash
readonly
バリデーションを通過したリクエストの値.
-
#widgets ⇒ Hash
readonly
このインスタンスが保持するウィジェット。キーがウィジェット名のシンボル、値がウィジェットのインスタンス.
Class Method Summary collapse
-
.fetch_request_multipart ⇒ Object
(AlForm) POSTリクエストの取り込み / multipart.
-
.get_parameter(w) ⇒ Object, NilClass
単一パラメータの取得/使い捨てミニフォーム機能.
-
.prefetch_request_get ⇒ Object
GETリクエストのキャッシュへの取り込み.
-
.prefetch_request_post ⇒ Object
POSTリクエストのキャッシュへの取り込み.
-
.request_get ⇒ Hash
getter / request_get.
-
.request_post ⇒ Hash
getter / request_post.
Instance Method Summary collapse
-
#add_message(message) ⇒ Object
メッセージの追加.
-
#add_widget(widget) ⇒ Object
ウィジェット追加.
-
#checked(name, value) ⇒ Object
(also: #selected)
inputタグ中の checked 属性生成.
-
#delete_widget(name) ⇒ Object
ウィジェット削除.
-
#fetch_request(method = nil) ⇒ Boolean, String
GET/POSTリクエストの取り込み.
-
#generate_form_template(arg = {}) ⇒ Object
簡易フォームテンプレートの生成 AlTemplateの使用を前提としたフォームのテンプレートを生成する。.
-
#generate_list_template(arg = {}) ⇒ Object
簡易リスト表示テンプレートの生成 AlTemplateの使用を前提とした一覧リスト表示形式のテンプレートを生成する。.
-
#generate_sheet_template(arg = {}) ⇒ Object
簡易内容表示テンプレートの生成 AlTemplateの使用を前提とした単票形式表示のテンプレートを生成する。.
-
#generate_sql_table(tname = "TABLENAME") ⇒ String
テーブル作成SQLのひな形作成.
-
#get_messages_by_html ⇒ String
html形式でメッセージの取得.
-
#get_tainted_value(name) ⇒ Object
(also: #-)
バリデーション前の値取得.
-
#get_value(name) ⇒ Object
(also: #[])
値取得.
-
#get_widget(name) ⇒ AlWidget
ウィジェットの取得.
-
#initialize(*widgets) ⇒ AlForm
constructor
(AlForm) constructor.
-
#make_tag(name, appendix_tag = {}) ⇒ String
(AlForm) HTMLタグの生成.
-
#make_tiny_form(appendix_tag = {}) ⇒ String
簡易フォームの自動生成.
-
#make_tiny_form_main ⇒ Object
簡易フォームの自動生成 メインメソッド.
-
#make_tiny_sheet ⇒ String
簡易内容表示.
-
#make_value(name) ⇒ String
(AlForm) HTML値の生成.
-
#method_missing(name, *args) ⇒ Object
ダイナミックローディング用フック.
-
#set_value(name, value) ⇒ Object
(also: #[]=)
値のセット.
-
#set_values(values) ⇒ Object
(also: #values=)
値の一括セット.
-
#set_widgets(*widgets) ⇒ Object
(also: #widgets=)
ウィジェットのセット.
-
#use_get_method(arg = {}) ⇒ Object
コントローラ使用時に、フォームでmethod=“GET”を使う.
-
#validate(names = nil) ⇒ Boolean
バリデーション.
Constructor Details
#initialize(*widgets) ⇒ AlForm
(AlForm) constructor
157 158 159 160 161 162 163 164 165 166 167 168 |
# File 'lib/al_form.rb', line 157 def initialize( * ) @widgets = {} @values = {} @validation_messages = {} @validation_messages_user_count = 0 @method = "POST" @action = Alone::request_uri() @tag_attr = {} @flag_setvalue_done = false ( ) end |
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(name, *args) ⇒ Object
ダイナミックローディング用フック
530 531 532 533 534 535 536 537 |
# File 'lib/al_form.rb', line 530 def method_missing( name, *args ) if METHOD_LIST[ name ] require METHOD_LIST[ name ] __send__( name, *args ) else raise NoMethodError, "undefined method `#{name}' for AlForm" end end |
Instance Attribute Details
#action ⇒ String
Returns HTMLフォームのactionアトリビュート.
143 144 145 |
# File 'lib/al_form.rb', line 143 def action @action end |
#flag_setvalue_done ⇒ Boolean
Returns 値のセットが終わっているかのフラグ(バリデーション前).
149 150 151 |
# File 'lib/al_form.rb', line 149 def flag_setvalue_done @flag_setvalue_done end |
#method ⇒ String
Returns HTMLフォームのmethodアトリビュート “GET” or “POST”.
140 141 142 |
# File 'lib/al_form.rb', line 140 def method @method end |
#tag_attr ⇒ Hash
Returns HTMLタグ生成時の追加アトリビュート.
146 147 148 |
# File 'lib/al_form.rb', line 146 def tag_attr @tag_attr end |
#validation_messages ⇒ Hash (readonly)
Returns バリデーションメッセージ。キーがウィジェット名のシンボル、値がメッセージ文字列.
137 138 139 |
# File 'lib/al_form.rb', line 137 def @validation_messages end |
#values ⇒ Hash (readonly)
Returns バリデーションを通過したリクエストの値.
134 135 136 |
# File 'lib/al_form.rb', line 134 def values @values end |
#widgets ⇒ Hash (readonly)
Returns このインスタンスが保持するウィジェット。キーがウィジェット名のシンボル、値がウィジェットのインスタンス.
131 132 133 |
# File 'lib/al_form.rb', line 131 def @widgets end |
Class Method Details
.fetch_request_multipart ⇒ Object
(AlForm) POSTリクエストの取り込み / multipart
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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 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 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 |
# File 'lib/al_form/multipart.rb', line 18 def self.fetch_request_multipart() req = {} # # extract boundary # boundary = nil ENV['CONTENT_TYPE'].split( /\s?;\s/ ).each do |a| if /\s*([^=]+)(=([^\s]*))?/ =~ a if $1 == 'boundary' boundary = '--' + $3 end end end return if ! boundary boundary.force_encoding( Encoding::ASCII_8BIT ) # # process post data # STRATEGY: # ステートマシンを使って解析する # ステートは、NONE -> HEADER -> CONTENT_START -> CONTENT_NEXT と遷移する # STDIN.set_encoding( "ASCII-8BIT" ) # TODO: ruby1.9 only remain_bytes = ENV['CONTENT_LENGTH'].to_i content = {} file = nil state = :STATE_NONE while remain_bytes > 0 && text = STDIN.gets do remain_bytes -= text.length # # check boundary # if text.start_with?( boundary ) state = :STATE_HEADER next if ! content[:name] key = content[:name].to_sym content[:data_body].force_encoding( AL_CHARSET ) content[:data_body].chomp! case req[key] when NilClass req[key] = file ? content : content[:data_body] when String req[key] = [ req[key], content[:data_body] ] when Array req[key] << content[:data_body] end if file file.flush if file.size >= 2 file.truncate( file.size - 2 ) # -2 is CR,LF end content[:size] = file.size file.close end content = {} file = nil next end # # process each content # case state when :STATE_HEADER case text.chop when /^Content-Disposition:(.+)$/i $1.split( ';' ).each do |a| if / *([^=]+)(="(.*)")?/ =~ a if (content[$1.to_sym] = $3) != nil content[$1.to_sym].force_encoding( AL_CHARSET ) end end end when /^Content-Type: *([^ ]+)$/i content[:content_type] = $1 when '' # data region starts at next line state = :STATE_CONTENT_START end when :STATE_CONTENT_START if content[:filename] # this is input type="file" tag uplfile = UploadedFile.new( self ) content[:tmp_name] = uplfile.path file = uplfile.file file.write( text ) content[:data_body] = '' else content[:data_body] = text # this is other input tag end state = :STATE_CONTENT_NEXT when :STATE_CONTENT_NEXT if file file.write( text ) else content[:data_body] << text end end end # end of all read @@request_post = req end |
.get_parameter(w) ⇒ Object, NilClass
単一パラメータの取得/使い捨てミニフォーム機能
107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 |
# File 'lib/al_form.rb', line 107 def self.get_parameter( w ) case ENV["REQUEST_METHOD"] when "GET" AlForm.prefetch_request_get() value = @@request_get[w.name.to_sym] when "POST" AlForm.prefetch_request_post() value = @@request_post[w.name.to_sym] else raise "method error. need GET or POST." end if value # GET/POSTされている。フィルタをかけてウィジェットに渡した結果を返す。 w.set_value( apply_filter( w.filter, value )) return w.validate() ? w.value : nil else # ウィジェットの初期値を返す。 return w.value end end |
.prefetch_request_get ⇒ Object
GETリクエストのキャッシュへの取り込み
36 37 38 39 40 41 |
# File 'lib/al_form.rb', line 36 def self.prefetch_request_get() return if ! @@request_get.empty? return if ! ENV["QUERY_STRING"] @@request_get = parse_urlencoded( ENV["QUERY_STRING"] ) end |
.prefetch_request_post ⇒ Object
POSTリクエストのキャッシュへの取り込み
47 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_form.rb', line 47 def self.prefetch_request_post() return if ! @@request_post.empty? # check request size if ENV["CONTENT_LENGTH"].to_i > AL_FORM_MAX_CONTENT_LENGTH @@flag_request_oversize = true end # proc multipart request data. if ENV["CONTENT_TYPE"] && ENV["CONTENT_TYPE"].start_with?("multipart/form-data") require "al_form/multipart" fetch_request_multipart() return end # read post data if ENV["CONTENT_LENGTH"] txt = $stdin.read( ENV["CONTENT_LENGTH"].to_i ) else txt = $stdin.read() end if ENV["CONTENT_TYPE"] && ENV["CONTENT_TYPE"].start_with?("application/x-www-form-urlencoded") @@request_post = parse_urlencoded( txt ) else @@request_post[""] = txt end end |
.request_get ⇒ Hash
渡された生データが入っているので、通常は使わない。
getter / request_get
83 84 85 |
# File 'lib/al_form.rb', line 83 def self.request_get() return @@request_get end |
.request_post ⇒ Hash
渡された生データが入っているので、通常は使わない。
getter / request_post
94 95 96 |
# File 'lib/al_form.rb', line 94 def self.request_post() return @@request_post end |
Instance Method Details
#add_message(message) ⇒ Object
ユーザプログラムから、任意のメッセージをセットできる。バリデーション validate() を行う前にクリアされるので、注意する。
メッセージの追加
306 307 308 309 |
# File 'lib/al_form.rb', line 306 def ( ) @validation_messages["al_user#{@validation_messages_user_count}"] = @validation_messages_user_count += 1 end |
#add_widget(widget) ⇒ Object
ウィジェット追加
204 205 206 |
# File 'lib/al_form.rb', line 204 def ( ) @widgets[ .name.to_sym ] = end |
#checked(name, value) ⇒ Object Also known as: selected
チェックボックス、または、ラジオボタンの、checked属性を生成する。htmlをべたに書く時にのみ使用する。
inputタグ中の checked 属性生成
493 494 495 496 497 498 499 500 501 502 503 504 505 506 507 508 |
# File 'lib/al_form.rb', line 493 def checked( name, value ) = @widgets[ name.to_sym ] case when AlCheckboxes return (.value.include?( value.to_sym ) || .value.include?( value.to_s )) ? "checked": "" when AlOptions return (.value && .value.to_sym == value.to_sym) ? "selected": "" when AlRadios return (.value && .value.to_sym == value.to_sym) ? "checked": "" else raise "Object not match. needs AlCheckboxes, AlOptions or AlRadios" end end |
#delete_widget(name) ⇒ Object
ウィジェット削除
214 215 216 217 |
# File 'lib/al_form.rb', line 214 def ( name ) @widgets.delete( name.to_sym ) @values.delete( name.to_sym ) end |
#fetch_request(method = nil) ⇒ Boolean, String
GET/POSTリクエストの取り込み
POSTされたデータのタイプが application/x-www-form-urlencoded もしくは、multipart/form-data ではない場合は、POSTデータそのものを返す。
337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 |
# File 'lib/al_form.rb', line 337 def fetch_request( method = nil ) # # リクエストを取得し、@@request_XXXにキャッシュする。 # case method || ENV["REQUEST_METHOD"] when "GET" AlForm.prefetch_request_get() req = @@request_get when "POST" return false if ENV["REQUEST_METHOD"] != "POST" AlForm.prefetch_request_post() req = @@request_post else raise "method error. need GET or POST." end # # リクエストが正当なものか確認 # if @@flag_request_oversize (p_("al", "Size is too large.")) return false end return req[""] if req[""] # return posted string. e.g. JSON. flag_exist = false @widgets.each {|k,w| next if k == :ctrl || k == :action break if (flag_exist = req.has_key?(k)) } return false if !flag_exist # # 各ウィジェットに、値を設定 # @widgets.each { |k,w| w.set_value( AlForm::apply_filter( w.filter, req[k] ? req[k] : "" )) } @flag_setvalue_done = true return true end |
#generate_form_template(arg = {}) ⇒ Object
簡易フォームテンプレートの生成AlTemplateの使用を前提としたフォームのテンプレートを生成する。
21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
# File 'lib/al_form/generate_form_template.rb', line 21 def generate_form_template( arg = {} ) flags = { :use_table=>true, :with_error_class=>true } flags.merge!( arg ) r = "<%= header_section %>\n<title></title>\n\n" r << "<%= body_section %>\n\n" r << "<%= @form.get_messages_by_html() %>\n\n" r << %Q(<form method="<%= @form.method %>" action="<%= @form.action %>">\n) if flags[:use_table] r << %Q(<table class="al-form-table">\n) @widgets.each do |k,w| r << %Q( <tr class="#{w.name}\">\n) if flags[:with_error_class] r << %Q( <td class="al-form-label<%= @form.validation_messages[:#{w.name}] ? "-error" : "" %>">#{w.label}\n) else r << %Q( <td class="al-form-label">#{w.label}\n) end r << %Q( <td class="al-form-value"><%= @form.make_tag(:#{w.name}) %>\n </tr>\n\n) end r << "</table>\n" else @widgets.each do |k,w| r << %Q( <div class="#{w.name}\">\n) if flags[:with_error_class] r << %Q( <span class="al-form-label<%= @form.validation_messages[:#{w.name}] ? "-error" : "" %>">#{w.label}</span>\n) else r << %Q( <span class="al-form-label">#{w.label}</span>\n) end r << %Q( <span class="al-form-value"><%= @form.make_tag(:#{w.name}) %></span>\n </div>\n\n) end end r << "</form>\n" r << "\n<%= footer_section %>" return r end |
#generate_list_template(arg = {}) ⇒ Object
簡易リスト表示テンプレートの生成AlTemplateの使用を前提とした一覧リスト表示形式のテンプレートを生成する。
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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 |
# File 'lib/al_form/generate_list_template.rb', line 20 def generate_list_template( arg = {} ) flags = { :use_table=>true } flags.merge!( arg ) r = %Q(<%= header_section %>\n<title></title>\n\n) r << %Q(<%= body_section %>\n\n) r << %Q(<table class="al-list-table">\n) r << %Q( <tr>\n) @widgets.each do |k,w| next if w.class == AlHidden || w.class == AlPassword || w.hidden || w.is_a?( AlButton ) r << %Q( <th>#{w.label}\n) end r << %Q( <th> \n) r << %Q( </tr>\n) r << %Q( <% @datas.each do |d| %>\n) r << %Q( <tr>\n) @widgets.each do |k,w| next if w.class == AlHidden || w.class == AlPassword || w.hidden || w.is_a?( AlButton ) r << %Q( <td><%= @form.widgets[:#{w.name}].make_value( d[:#{w.name}] ) %>\n) end r << %Q( <td class="al-navigation">\n) r << %Q( <a href="<%=h make_uri_key(d, :action=>"update") %>">変更</a>\n) r << %Q( <a href="<%=h make_uri_key(d, :action=>"delete") %>">削除</a>\n) r << %Q( </tr>\n) r << %Q( <% end %>\n) r << %Q(</table>\n) r << %Q(<hr>\n) r << %Q( <div class="al-navigation"> <% if @persist.get_previous_offset() %> <a href="<%=h make_uri( @request.merge({:offset=>@persist.get_previous_offset()}) ) %>">≪前ページ</a> <% else %> <span class="al-inactive">≪前ページ</span> <% end %> <% if @persist.get_next_offset() %> <a href="<%=h make_uri( @request.merge({:offset=>@persist.get_next_offset()}) ) %>">次ページ≫</a> <% else %> <span class="al-inactive">次ページ≫</span> <% end %> <a href="<%=h make_uri( :action=>"create" ) %>">新規登録</a> </div> ) r << %Q(\n<%= footer_section %>) return r end |
#generate_sheet_template(arg = {}) ⇒ Object
簡易内容表示テンプレートの生成AlTemplateの使用を前提とした単票形式表示のテンプレートを生成する。
20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 |
# File 'lib/al_form/generate_sheet_template.rb', line 20 def generate_sheet_template( arg = {} ) flags = { :use_table=>true } flags.merge!( arg ) r = "<%= header_section %>\n<title></title>\n\n" r << "<%= body_section %>\n\n" if flags[:use_table] r << %Q(<table class="al-sheet-table">\n) @widgets.each do |k,w| next if w.is_a?( AlButton ) r << %Q( <tr class="#{w.name}">\n) r << %Q( <td class="al-sheet-label">#{w.label}\n) r << %Q( <td class="al-sheet-value"><%= @form.make_value(:#{w.name}) %>\n) r << %Q( </tr>\n\n) end r << "</table>\n" else @widgets.each do |k,w| next if w.is_a?( AlButton ) r << %Q( <div class="#{w.name}">\n) r << %Q( <span class="al-sheet-label">#{w.label}</span>\n) r << %Q( <span class="al-sheet-value"><%= form.make_value(:#{w.name} ) %></span>\n) r << %Q( </div>\n\n) end end r << "\n<%= footer_section %>" return r end |
#generate_sql_table(tname = "TABLENAME") ⇒ String
テーブル作成SQLのひな形作成
19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/al_form/generate_sql_table.rb', line 19 def generate_sql_table( tname = "TABLENAME" ) a = [] @widgets.each do |k,w| case w when AlInteger c = "#{k} integer" when AlFloat c = "#{k} double precision" when AlTimestamp c = "#{k} timestamp" when AlDate c = "#{k} date" when AlTime c = "#{k} time" when AlButton, AlSubmit next else c = "#{k} text" end if w.required c << " not null" end a << c end return "create table #{tname} (#{a.join( ', ' )});" end |
#get_messages_by_html ⇒ String
html形式でメッセージの取得
317 318 319 320 321 322 323 |
# File 'lib/al_form.rb', line 317 def () r = "" @validation_messages.each do |k,v| r << Alone::escape_html_br(v) << "<br>\n" end return r end |
#get_tainted_value(name) ⇒ Object Also known as: -
alias - は、テンプレートで使われることを想定して定義した。プログラム中では、使わない方が良いのではないか。
バリデーション前の値取得
293 294 295 |
# File 'lib/al_form.rb', line 293 def get_tainted_value( name ) return (w = @widgets[ name.to_sym ]) ? w.value : nil end |
#get_value(name) ⇒ Object Also known as: []
バリデーション後の値を取得する。値として何が返るかは、ウィジェットの種類によって変わるので、詳しくは各ウィジェットを参照。
値取得
279 280 281 |
# File 'lib/al_form.rb', line 279 def get_value( name ) return @values[name.to_sym] end |
#get_widget(name) ⇒ AlWidget
ウィジェットの取得
226 227 228 |
# File 'lib/al_form.rb', line 226 def ( name ) return @widgets[ name.to_sym ] end |
#make_tag(name, appendix_tag = {}) ⇒ String
指定された名前を持つウィジェットのタグを生成し返す。
(AlForm) HTMLタグの生成
461 462 463 464 465 466 |
# File 'lib/al_form.rb', line 461 def make_tag( name, appendix_tag = {} ) = @widgets[ name.to_sym ] raise %Q(No widget defined, named "#{name}".) if ! return .make_tag( appendix_tag ) end |
#make_tiny_form(appendix_tag = {}) ⇒ String
簡易フォームの自動生成
tableタグを使って、位置をそろえている。
21 22 23 24 25 26 27 28 29 30 31 |
# File 'lib/al_form/make_tiny_form.rb', line 21 def make_tiny_form( appendix_tag = {} ) r = %Q(<form method="#{@method}" action="#{Alone::escape_html(@action)}") @tag_attr.each {|k,v| r << (v ? %Q( #{k}="#{Alone::escape_html(v)}") : " #{k}") } appendix_tag.each {|k,v| r << (v ? %Q( #{k}="#{Alone::escape_html(v)}") : " #{k}") } r << ">\n" << make_tiny_form_main() << "</form>\n" return r end |
#make_tiny_form_main ⇒ Object
簡易フォームの自動生成 メインメソッド
TODO: アプリケーションからこのメソッドが独自によばれることがなさそうなら
make_tiny_form()へ吸収合併を考えること。
41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 |
# File 'lib/al_form/make_tiny_form.rb', line 41 def make_tiny_form_main() r = %Q(<table class="al-form-table">\n) hidden = "" @widgets.each do |k,w| if w.hidden hidden << w.make_tag() next end r << %Q( <tr class="#{w.name}">\n) if @validation_messages[ k ] r << %Q( <td class="al-form-label-error">#{w.label}\n) else r << %Q( <td class="al-form-label">#{w.label}\n) end r << %Q( <td class="al-form-value">#{w.make_tag()}\n </tr>\n) end r << "</table>\n" if ! hidden.empty? r << "<div>#{hidden}</div>\n" end return r end |
#make_tiny_sheet ⇒ String
簡易内容表示
tableタグを使って、位置をそろえている。
20 21 22 23 24 25 26 27 28 29 30 31 32 |
# File 'lib/al_form/make_tiny_sheet.rb', line 20 def make_tiny_sheet() r = %Q(<table class="al-sheet-table">\n) @widgets.each do |k,w| next if w.is_a?( AlButton ) || w.hidden r << %Q( <tr class="#{w.name}">\n) r << %Q( <td class="al-sheet-label">#{w.label}\n) r << %Q( <td class="al-sheet-value">#{w.make_value()}\n </tr>\n) end r << "</table>\n" return r end |
#make_value(name) ⇒ String
make_tag()との対称性をもたせるために存在する。
(AlForm) HTML値の生成
476 477 478 479 480 481 |
# File 'lib/al_form.rb', line 476 def make_value( name ) = @widgets[ name.to_sym ] raise %Q(No widget defined, named "#{name}".) if ! return .make_value() end |
#set_value(name, value) ⇒ Object Also known as: []=
受け付けるvalueは、ウィジェットの種類によって変わる。詳しくは、各ウィジェットを参照。
値のセット
239 240 241 242 243 |
# File 'lib/al_form.rb', line 239 def set_value( name, value ) k = name.to_sym @widgets[k].set_value( value ) @values[k] = @widgets[k].value # valueは、Widgetごとの都合による加工がされているかもしれない end |
#set_values(values) ⇒ Object Also known as: values=
nilを与えられた場合は、何も行わない。それ以外の場合は、fetch_request()を呼び出したのと同様、validate()の値自動取得が働かなくなるので注意する。
値の一括セット
255 256 257 258 259 260 261 262 263 264 265 266 |
# File 'lib/al_form.rb', line 255 def set_values( values ) return if ! values raise "set_values() needs Hash parameter." if values.class != Hash values.each do |k,v| k = k.to_sym next if ! @widgets[k] @widgets[k].set_value( v ) @values[k] = @widgets[k].value # valueは、Widgetごとの都合による加工がされているかもしれない end @flag_setvalue_done = true end |
#set_widgets(*widgets) ⇒ Object Also known as: widgets=
ウィジェットのセット
190 191 192 193 194 195 |
# File 'lib/al_form.rb', line 190 def ( * ) raise "Parameter type error. need Array." if .class != Array .flatten.each do |w| @widgets[ w.name.to_sym ] = w end end |
#use_get_method(arg = {}) ⇒ Object
form method=“GET” と、AlControllerの仕組みを共存させるためのメソッド。
コントローラ使用時に、フォームでmethod=“GET”を使う
178 179 180 181 182 |
# File 'lib/al_form.rb', line 178 def use_get_method( arg = {} ) @widgets[:ctrl] = AlHidden.new("ctrl", :value=>(arg[:ctrl] || Alone::ctrl)) @widgets[:action] = AlHidden.new("action", :value=>(arg[:action] || Alone::action)) @method = "GET" end |
#validate(names = nil) ⇒ Boolean
引数を与えなければ、すべてのウィジェットについてバリデーションを実施するバリデーションが成功して、はじめて @values に使える値が用意される。
バリデーション
391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 418 419 420 421 422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439 440 441 442 443 444 445 446 447 448 449 |
# File 'lib/al_form.rb', line 391 def validate( names = nil ) @validation_messages.clear # # リクエストの取得がまだ行われていないなら、自動で取得する # if ! @flag_setvalue_done return false if ! fetch_request() end case names when NilClass # # すべてのウィジェットについてバリデーションを実施 # @widgets.each do |k,w| next if w.class == AlSubmit # valueをとりたくないのでskip if w.validate() @values[k] = w.value else @validation_messages[k] = w. end end when Array # # 選択的にバリデーションを実施 # names.each do |k| k = k.to_sym w = @widgets[k] raise "Not found widget '#{k}'." if ! w next if w.class == AlSubmit # valueをとりたくないのでskip if w.validate() @values[k] = w.value else @validation_messages[k] = w. end end when String, Symbol # # 一つだけバリデーションを実施 # k = names.to_sym w = @widgets[k] if w.validate() @values[k] = w.value else @validation_messages[k] = w. end else raise 'validate() needs an array, string or symbol argument.' end return @validation_messages.empty? end |