Module | ApplicationHelper
In: | app/helpers/application_helper.rb

フレームワークのどの view でも利用できる helper を定義する。

### Methods

application_menu_title_only check_box_with_label constant_select_tag error_messages_for lcr_button_box link_to_close link_to_view_motion open_to_pick pagination radio_box_with_label radio_button_tag_with_label radio_button_with_label search_to_pick set_fragment set_title submit_tag tree_icon_close tree_icon_close_without_tag tree_icon_leaf tree_icon_leaf_without_tag tree_icon_open tree_icon_open_without_tag x_form_tag

### Included Modules

FragmentHash::UrlHelper

### Constants

CHECK_BUGS | = | true

### Public Instance methods

application_menu_title_only(title, view_handle=true)

アプリケーションメニューのタイトルとして表示するとともに設定する。

[Source]

         # File app/helpers/application_helper.rb, line 247
    247:   def application_menu_title_only(title, view_handle=true)
    248:     @title = title
    249:     return "<table class=\"application_menu\">\n<tr class=\"application_menu_line1\">\n<td>\n<span class=\"\#{view_handle ? 'view_handle ' : ''}title\">\#{h title}</span>\n</td>\n</tr>\n</table>\n"
    250:   end

check_box_with_label(object_name, method, label, options = {}, checked_value = "1", unchecked_value = "0")

ラベルつきの `check_box`

[Source]

        # File app/helpers/application_helper.rb, line 40
    40:   def check_box_with_label(object_name, method, label, options = {}, checked_value = "1", unchecked_value = "0")
    41:     with_label(label, options, object_name, method) do |o|
    42:       check_box(object_name, method, o, checked_value, unchecked_value)
    43:     end
    44:   end

constant_select_tag(c, name, x, k, blank=nil)

固定のオプションの配列 c から構成される select box を返す。

[Source]

         # File app/helpers/application_helper.rb, line 402
    402:   def constant_select_tag(c, name, x, k, blank=nil)
    403:     options = c.map {|pair| [s_(pair.first), pair.last]}
    404:     options.unshift([blank, ""]) if blank
    405:     select_tag(name, options_for_select(options, x.attributes[k]))
    406:   end

error_messages_for(*params)

params に対応するエラーメッセージのノードを返す。

[Source]

         # File app/helpers/application_helper.rb, line 322
    322:   def error_messages_for(*params)
    323:     if @stale_object_error
    324:       message = [ content_tag(:h4, s_("Attempted to update a stale object")),
    325:                   content_tag(:p, s_("Someone has updated the object. Please go back to show the new version of it."))
    326:                 ]
    327:       return content_tag(:div, message.join, :class => "errorExplanation")
    328:     end
    329:     options = params.last.is_a?(Hash) ? params.pop.symbolize_keys : {}
    330:     objects = params.collect {|object_name| instance_variable_get("@#{object_name}") }.compact
    331:     object_names = params.dup
    332:     count   = objects.inject(0) {|sum, object| sum + object.errors.count }
    333:     if count.zero?
    334:       ''
    335:     else
    336:       return [
    337:         '<div class="errorExplanation">',
    338:         '<h4>',
    339:         n_("%{num} error prohibited this data from being saved",
    340:           "%{num} errors prohibited this data from being saved",
    341:           count) % { :num => count },
    342:         '</h4>',
    343:         '<p>',
    344:         n_("There was a problem with the following field.",
    345:           "There were problems with the following fields.",
    346:           count),
    347:         '</p>',
    348:         '</div>',
    349:       ].join("")
    350:     end
    351:   end

lcr_button_box(buttons=@lcr_buttons)

左|中央|右にレイアウトされたボタン列を返す。

[Source]

         # File app/helpers/application_helper.rb, line 409
    409:   def lcr_button_box(buttons=@lcr_buttons)
    410:     return "<table class=\"lcr_button_box\">\n<tr>\n<td class=\"lcr_button_box_left\">\#{buttons[:left] || '&nbsp;'}</td>\n<td class=\"lcr_button_box_center\">\#{buttons[:center] || '&nbsp;'}</td>\n<td class=\"lcr_button_box_right\">\#{buttons[:right] || '&nbsp;'}</td>\n</tr>\n</table>\n"
    411:   end

link_to_close(motion_params, options, html_options = {})

「閉じる」リンク リンクの html 要素の ID は "link_#{@current_view}_close*" という形になる。

- motion_params - link_to_view_motion に第4引数として渡される。
- options - link_to_view_motion に第5引数として渡される。
- html_options - link_to_view_motion に第6引数として渡される。

[Source]

        # File app/helpers/application_helper.rb, line 71
    71:   def link_to_close(motion_params, options, html_options = {})
    72:     return link_to_view_motion(h(s_("button|Close")), @current_view, "close", motion_params, options, html_options)
    73:   end

link_to_view_motion(name, view, motion, motion_params, options, html_options = {})

サブ画面へのリンク リンクの html 要素の ID の形は "link_#{part of view}_#{motion}_#{join of motion_params ‘key_value’ with ‘_’}" となる。

- name - link_to に第1引数として渡される。
- view - "view_*" という形の html 要素の ID を表す文字列。この要素に Ajax によってリンク先の画面が表示される。
- motion - リンクの html 要素の ID を構成する。値が nil なら @fragment_hash から計算される。
- motion_params - リンクの html 要素の ID を構成する。

                      十分なエントリがなければ @fragment_hash から計算される。
                      値が nil なエントリは無視される。
                      "_" というキーでリンクの html 要素の ID に suffix を与えることができる。

- options - link_to に第2引数として渡される。

                ハッシュで指定された場合、十分なエントリがなければ @fragment_hash から計算される。

- html_options - link_to に第3引数として渡される。

                     ただし :id などいくつかのエントリは上書きされる。

[Source]

         # File app/helpers/application_helper.rb, line 174
    174:   def link_to_view_motion(name, view, motion, motion_params, options, html_options = {})
    175:     view ||= @current_view
    176:     if /\Aview_([a-z0-9]+)\z/ =~ view
    177:       view = $1
    178:     end
    179:     if CHECK_BUGS
    180:       if @current_view.nil?
    181:         raise "[bug] @current_view is nil"
    182:       end
    183:       if /[^a-z0-9]/ =~ view
    184:         raise "[bug] invalid view #{view.inspect}"
    185:       end
    186:       if motion.nil? && "view_#{view}" != @current_view
    187:         raise "[bug] missing motion"
    188:       end
    189:     end
    190:     motion ||= @fragment_hash.motion(view)
    191:     link_params = ["link", view, motion]
    192:     motion_params = motion_params.with_indifferent_access
    193:     if options.is_a?(Hash)
    194:       link_to_options = options.with_indifferent_access
    195:     end
    196:     @fragment_hash[view].each do |key, value|
    197:       if value
    198:         motion_params[key] = value unless motion_params.key?(key)
    199:         if link_to_options
    200:           link_to_options[key] = value unless link_to_options.key?(key)
    201:         end
    202:       end
    203:     end
    204:     @fragment_hash.default_params(view).each do |key, default_value|
    205:       if motion_params[key] == default_value
    206:         motion_params.delete(key)
    207:       end
    208:       if link_to_options
    209:         if link_to_options[key] == default_value
    210:           link_to_options.delete(key)
    211:         end
    212:       end
    213:     end
    214:     suffix = motion_params.delete("_")
    215:     motion_params.keys.sort.each do |key|
    216:       if motion_params[key]
    217:         link_params << key << motion_params[key]
    218:       end
    219:     end
    220:     link_params << suffix
    221:     html_options[:id] = link_params.compact.join("_")
    222:
    223:     if html_options[:confirm] && html_options[:method] == :post
    224:       html_options[:onclick] = "if (confirm('#{h html_options[:confirm]}')) { onAjaxLink(this); }; return false"
    225:       html_options.delete(:confirm)
    226:       html_options.delete(:method)
    227:     elsif html_options[:onclick]
    228:       html_options[:onclick] = "#{html_options[:onclick]}return onAjaxLink(this)"
    229:     else
    230:       html_options[:onclick] = "return onAjaxLink(this)"
    231:     end
    232:     link_to_options ||= options
    233:     return link_to(name, link_to_options, html_options)
    234:   end

open_to_pick(x, options = {})

選択部品へのリンク

[Source]

         # File app/helpers/application_helper.rb, line 367
    367:   def open_to_pick(x, options = {})
    368:     c = x.class.to_s
    369:     singular = c.underscore
    370:     plural = singular.pluralize
    371:     dom_id = "search_#{plural}_#{x.id}"
    372:     url = {:action => "open_#{singular}", :id => x.id}
    373:     url = url.update(options)
    374:     link_to_remote(tree_icon_open, {
    375:                      :url => url,
    376:                      :success => "$$('#search_#{plural} a').each(function(x){x.style.fontWeight='normal';});$('#{dom_id}').style.fontWeight='bold';",
    377:                      :update => "area_#{plural}",
    378:                    }, {
    379:                      :id => dom_id,
    380:                      :class => "dropdown"
    381:                    })
    382:   end

pagination(locals)

ページ部品

[Source]

         # File app/helpers/application_helper.rb, line 76
     76:   def pagination(locals)
     77:     {
     78:       :html_class    => "",
     79:       :left_columns  => "",
     80:       :options       => {},
     81:       :right_columns => "",
     82:       :suffix        => "",
     83:     }.each do |key, value|
     84:       locals[key] ||= value
     85:     end
     86:     tds = []
     87:     tds << locals[:left_columns]
     88:     if previous_page = locals[:pages].current.previous
     89:       img = image_tag("previous_page_found.gif", :alt => _("Previous page"))
     90:       if locals[:update]
     91:         a = link_to_remote(img,
     92:                            :update => locals[:update],
     93:                            :complete => visual_effect(:highlight, locals[:update]),
     94:                            :url => locals[:options].merge({:action => locals[:action], :page => previous_page.to_i, :per => locals[:per]}))
     95:       else
     96:         a = link_to_view_motion(img,
     97:                                 locals[:view], nil,
     98:                                 {"page" => previous_page.to_i, "_" => locals[:suffix]+"_prev"},
     99:                                 locals[:options].merge({:page => previous_page.to_i}),
    100:                                 :class => locals[:html_class])
    101:       end
    102:     else
    103:       a = image_tag("previous_page_not_found.gif", :alt => _("Previous page"))
    104:     end
    105:     tds << content_tag(:td, a, :class => "previous_page")
    106:     current = locals[:pages].current_page.to_i
    107:     ((current-2)..(current+2)).each do |n|
    108:       if locals[:pages].has_page_number?(n)
    109:         if current == n
    110:           b = n.to_i
    111:         elsif locals[:update]
    112:           b = link_to_remote(n.to_s,
    113:                              :update => locals[:update],
    114:                              :complete => visual_effect(:highlight, locals[:update]),
    115:                              :url => locals[:options].merge({:action => locals[:action], :page => n, :per => locals[:per]}))
    116:         else
    117:           b = link_to_view_motion(n.to_s,
    118:                                   locals[:view], nil,
    119:                                   {"page" => n, "_" => locals[:suffix]},
    120:                                   locals[:options].merge({ :page => n }),
    121:                                   :class => locals[:html_class])
    122:         end
    123:       else
    124:         b = "&nbsp;"
    125:       end
    126:       tds << content_tag(:td, b, :class => "each_page")
    127:     end
    128:     if next_page = locals[:pages].current.next
    129:       img = image_tag("next_page_found.gif", :alt => _("Next page"))
    130:       if locals[:update]
    131:         c = link_to_remote(img,
    132:                            :update => locals[:update],
    133:                            :complete => visual_effect(:highlight, locals[:update]),
    134:                            :url => locals[:options].merge({:action => locals[:action], :page => next_page.to_i, :per => locals[:per]}))
    135:       else
    136:         c = link_to_view_motion(img,
    137:                                 locals[:view], nil,
    138:                                 {"page" => next_page.to_i, "_" => locals[:suffix]+"_next"},
    139:                                 locals[:options].merge({:page => next_page.to_i}),
    140:                                 :class => locals[:html_class])
    141:       end
    142:     else
    143:       c = image_tag("next_page_not_found.gif", :alt => _("Next page"))
    144:     end
    145:     tds << content_tag(:td, c, :class => "next_page")
    146:     d = n_("%{first_item}-%{last_item} of %{item_count} item",
    147:            "%{first_item}-%{last_item} of %{item_count} items",
    148:            locals[:pages].item_count) % {
    149:       :first_item => locals[:pages].current.first_item,
    150:       :last_item  => locals[:pages].current.last_item,
    151:       :item_count => locals[:pages].item_count
    152:     }
    153:     tds << content_tag(:td, d)
    154:     tds << locals[:right_columns]
    155:     content = content_tag(:tr, tds.join)
    156:     return content_tag(:table, content, :class => "pagination")
    157:   end

radio_box_with_label(object_name, method)

ラベルつきの radio box

[Source]

        # File app/helpers/application_helper.rb, line 47
    47:   def radio_box_with_label(object_name, method)
    48:     "#{object_name.classify}::LABEL_#{method.upcase}".constantize.map do |pair|
    49:       radio_button_with_label(object_name, method, pair.last, s_(pair.first))
    50:     end.join(" ")
    51:   end

radio_button_tag_with_label(name, value, label_body, checked = false, options = {})

ラベルつきの `radio_button_tag`

[Source]

        # File app/helpers/application_helper.rb, line 61
    61:   def radio_button_tag_with_label(name, value, label_body, checked = false, options = {})
    62:     options[:id] ||= "#{name}_#{value}"
    63:     return radio_button_tag(name, value, checked, options) + content_tag(:label, label_body, {:for => options[:id]})
    64:   end

radio_button_with_label(object_name, method, tag_value, label, options = {})

ラベルつきの `radio_button`

[Source]

        # File app/helpers/application_helper.rb, line 54
    54:   def radio_button_with_label(object_name, method, tag_value, label, options = {})
    55:     with_label(label, options, object_name, method, tag_value) do |o|
    56:       radio_button(object_name, method, tag_value, o)
    57:     end
    58:   end

search_to_pick(singular, options = {})

選択部品へのリンクを構成する。

[Source]

         # File app/helpers/application_helper.rb, line 354
    354:   def search_to_pick(singular, options = {})
    355:     plural = singular.to_s.pluralize
    356:     url = {:action => "search_#{plural}"}
    357:     url = url.update(options)
    358:     {
    359:       :url => url,
    360:       :update => "area_#{plural}",
    361:       :complete => visual_effect(:highlight, "area_#{plural}"),
    362:       :html => {:action => url_for(url)}
    363:     }
    364:   end

set_fragment(fragment)

fragment を埋め込む

[Source]

         # File app/helpers/application_helper.rb, line 262
    262:   def set_fragment(fragment)
    263:     return "<form>\n<input type=\"hidden\" class=\"fragment_setter\" value=\"\#{h fragment}\">\n</form>\n"
    264:   end

set_title(title, hidden=request.xhr?)

ノードとして表示するとともに、タイトルを設定する。

[Source]

         # File app/helpers/application_helper.rb, line 237
    237:   def set_title(title, hidden=request.xhr?)
    238:     @title = title
    239:     if hidden
    240:       return "<h1 class='title' style='display: none'>#{h(title)}</h1>"
    241:     else
    242:       return "<h1 class='title'>#{h(title)}</h1>"
    243:     end
    244:   end

submit_tag(value, options={})

状態遷移時の効果を加えた `submit_tag`。

[Source]

         # File app/helpers/application_helper.rb, line 305
    305:   def submit_tag(value, options={})
    306:     options = options.with_indifferent_access
    307:     disable_with = options.delete("disable_with") || s_("submit_tag|please wait ...")
    308:     onclick = options.delete("onclick")
    309:     if onclick
    310:       onclick = "App.onSubmitTag(this,'#{disable_with}');#{onclick};return false;"
    311:     else
    312:       onclick = "return App.onSubmitTag(this,'#{disable_with}');"
    313:     end
    314:     options = {
    315:       "class" => "button",
    316:       "onclick" => onclick,
    317:     }.merge(options)
    318:     super(value, options)
    319:   end

tree_icon_close()

「閉じる」アイコン

[Source]

        # File app/helpers/application_helper.rb, line 25
    25:   def tree_icon_close
    26:     '<span class="tree_icon tree_icon_close">&#x25BC;</span>'
    27:   end

tree_icon_close_without_tag()

「閉じる」アイコン(タグ無し)

[Source]

        # File app/helpers/application_helper.rb, line 10
    10:   def tree_icon_close_without_tag
    11:     "&#x25BC;"
    12:   end

tree_icon_leaf()

「末端」アイコン

[Source]

        # File app/helpers/application_helper.rb, line 35
    35:   def tree_icon_leaf
    36:     '<span class="tree_icon tree_icon_leaf">&#x3000;</span>'
    37:   end

tree_icon_leaf_without_tag()

「末端」アイコン(タグ無し)

[Source]

        # File app/helpers/application_helper.rb, line 20
    20:   def tree_icon_leaf_without_tag
    21:     "&#x3000;"
    22:   end

tree_icon_open()

「開く」アイコン

[Source]

        # File app/helpers/application_helper.rb, line 30
    30:   def tree_icon_open
    31:     '<span class="tree_icon tree_icon_open">&#x25B2;</span>'
    32:   end

tree_icon_open_without_tag()

「開く」アイコン(タグ無し)

[Source]

        # File app/helpers/application_helper.rb, line 15
    15:   def tree_icon_open_without_tag
    16:     "&#x25B2;"
    17:   end

x_form_tag(url={}, options={}, *parameters_for_url, &block)

Ajax に対応したフォームを構成する。

[Source]

         # File app/helpers/application_helper.rb, line 272
    272:   def x_form_tag(url={}, options={}, *parameters_for_url, &block)
    273:     view = @current_view
    274:     url = url_for(url) if url.is_a?(Hash)
    275:     if /\Aview_[a-z0-9]+\z/ !~ view
    276:       raise "invalid view #{view.inspect}"
    277:     end
    278:     options[:url] ||= url
    279:     options[:update] = view
    280:     options[:form] = true
    281:     options[:html] ||= {}
    282:
    283:     function = remote_function(options)
    284:     if view != "view_main"
    285:       function.sub!(/Updater\('#{view}',/) do
    286:         "Updater($('#{view}')||$('view_main'),"
    287:       end
    288:     end
    289:     function.sub!(/asynchronous:true,/) do
    290:       "app_view:'#{view}',#{$&}"
    291:     end
    292:
    293:     options[:html][:onsubmit] = (options[:html][:onsubmit] ? options[:html][:onsubmit] + "; " : "")
    294:     if view != "view_main"
    295:       options[:html][:onsubmit] << "if(!$('#{view}')&&!$('view_main')){return true};"
    296:     else
    297:       options[:html][:onsubmit] << "if(!$('#{view}')){return true};"
    298:     end
    299:     options[:html][:onsubmit] << "#{function};return false;"
    300:
    301:     form_tag(options[:html].delete(:action) || url_for(options[:url]), options[:html], *parameters_for_url, &block)
    302:   end

[Validate]