Wraps a specific model class
Methods
Public Class
Public Instance
- associated_model_class
- associated_object_display_name
- association_links_for
- autocomplete_options_for
- before_action_hook
- class_name
- column_options_for
- column_value
- columns_for
- default_object_display_name
- destroy
- display_name_for
- eager_for
- eager_graph_for
- edit_html_for
- filter_for
- form_attributes_for
- form_options_for
- framework
- hook
- inline_mtm_assocs
- lazy_load_association_links?
- limit_for
- link
- model
- mtm_association_select_options
- new
- object_display_name
- opts
- order_for
- page_footer_for
- page_header_for
- redirect_for
- select_options
- show_html_for
- supported_action?
- supported_mtm_edit?
- supported_mtm_update?
- table_class_for
Constants
AUTOCOMPLETE_TYPES | = | [:show, :edit, :delete, :association, :mtm_edit].freeze |
Array of supported autocomplete types |
|
DEFAULT_LIMIT | = | 25 |
The default number of records to show on each browse/search results pages |
|
DEFAULT_SUPPORTED_ACTIONS | = | [:browse, :new, :show, :edit, :delete, :search, :mtm_edit] |
The default supported actions for models. |
|
DEFAULT_TABLE_CLASS | = | "table table-bordered table-striped" |
The default table class to use for browse/search results pages |
|
VALID_CONSTANT_NAME_REGEXP | = | /\A(?:::)?([A-Z]\w*(?:::[A-Z]\w*)*)\z/.freeze |
Regexp for valid constant names, to prevent code execution. |
Attributes
framework | [R] |
The |
opts | [R] |
The options for the given model. |
Public Class methods
Create a new instance for the given model type and underlying model class tied to the given framework.
# File lib/autoforme/model.rb 25 def self.for(framework, type, model_class, &block) 26 model = AutoForme.model_class_for(type).new(model_class, framework) 27 model.instance_exec(&block) if block 28 model 29 end
# File lib/autoforme/model.rb 46 def initialize(model, framework) 47 @model = model 48 @framework = framework 49 @opts = {} 50 end
Public Instance methods
The AutoForme::Model
instance associated to the given association.
# File lib/autoforme/model.rb 246 def associated_model_class(assoc) 247 framework.model_class(associated_class(assoc)) 248 end
A human readable string for the associated object.
# File lib/autoforme/model.rb 332 def associated_object_display_name(assoc, request, obj) 333 apply_name_method(column_options_for(:mtm_edit, request, assoc)[:name_method], obj, :mtm_edit, request) 334 end
# File lib/autoforme/model.rb 204 def association_links_for(type, request) 205 case v = handle_proc(association_links || framework.association_links_for(model, type, request), type, request) 206 when nil 207 [] 208 when Array 209 v 210 when :all 211 association_names 212 when :all_except_mtm 213 association_names - mtm_association_names 214 else 215 [v] 216 end 217 end
# File lib/autoforme/model.rb 226 def autocomplete_options_for(type, request) 227 return unless AUTOCOMPLETE_TYPES.include?(type) 228 framework_opts = framework.autocomplete_options_for(model, type, request) 229 model_opts = handle_proc(autocomplete_options, type, request) 230 if model_opts 231 (framework_opts || {}).merge(model_opts) 232 end 233 end
Run framework and model before_action hooks with type symbol and request.
# File lib/autoforme/model.rb 276 def before_action_hook(type, request) 277 if v = framework.before_action 278 v.call(type, request) 279 end 280 if v = before_action 281 v.call(type, request) 282 end 283 end
The name to display to the user for this model.
# File lib/autoforme/model.rb 236 def class_name 237 class_display_name || model.name 238 end
The options to use for the given column and request. Instead of the model options overriding the framework options, they are merged together.
# File lib/autoforme/model.rb 100 def column_options_for(type, request, column) 101 framework_opts = case framework_opts = framework.column_options 102 when Proc, Method 103 framework_opts.call(model, column, type, request) || {} 104 else 105 extract_column_options(framework_opts, column, type, request) 106 end 107 108 model_opts = case model_opts = column_options 109 when Proc, Method 110 model_opts.call(column, type, request) || {} 111 else 112 extract_column_options(model_opts, column, type, request) 113 end 114 115 opts = framework_opts.merge(model_opts).dup 116 117 if association?(column) && associated_model = associated_model_class(column) 118 if associated_model.autocomplete_options_for(:association, request) && !opts[:as] && association_type(column) == :one 119 opts[:type] = 'text' 120 opts[:class] = 'autoforme_autocomplete' 121 opts[:attr] = {'data-column'=>column, 'data-type'=>type} 122 opts[:name] = form_param_name(column) 123 else 124 unless opts[:name_method] 125 opts[:name_method] = lambda{|obj| associated_model.object_display_name(:association, request, obj)} 126 end 127 128 case type 129 when :edit, :new, :search_form 130 unless opts[:options] || opts[:dataset] 131 opts[:dataset] = lambda{|ds| associated_model.apply_dataset_options(:association, request, ds)} 132 end 133 end 134 end 135 end 136 137 case type 138 when :show, :search_form 139 opts[:required] = false unless opts.has_key?(:required) 140 if type == :search_form && opts[:as] == :textarea 141 opts.delete(:as) 142 end 143 end 144 145 opts 146 end
The column value to display for the given object and column.
# File lib/autoforme/model.rb 251 def column_value(type, request, obj, column) 252 v = obj.send(column) 253 return if v.nil? 254 if association?(column) 255 opts = column_options_for(type, request, column) 256 case nm = opts[:name_method] 257 when Symbol, String 258 v = v.send(nm) 259 when nil 260 else 261 v = nm.call(v) 262 end 263 end 264 if v.is_a?(base_class) 265 v = default_object_display_name(v) 266 end 267 v 268 end
# File lib/autoforme/model.rb 94 def columns_for(type, request) 95 handle_proc(columns || framework.columns_for(model, type, request), type, request) || default_columns 96 end
A fallback for the display name for the object if none is configured.
# File lib/autoforme/model.rb 337 def default_object_display_name(obj) 338 if obj.respond_to?(:forme_name) 339 obj.forme_name 340 elsif obj.respond_to?(:name) 341 obj.name 342 else 343 primary_key_value(obj) 344 end.to_s 345 end
Destroy the given object, deleting it from the database.
# File lib/autoforme/model.rb 271 def destroy(obj) 272 obj.destroy 273 end
# File lib/autoforme/model.rb 200 def display_name_for 201 display_name || framework.display_name_for(model) 202 end
# File lib/autoforme/model.rb 160 def eager_for(type, request) 161 handle_proc(eager, type, request) 162 end
# File lib/autoforme/model.rb 164 def eager_graph_for(type, request) 165 handle_proc(eager_graph, type, request) 166 end
# File lib/autoforme/model.rb 152 def edit_html_for(obj, column, type, request) 153 handle_proc(edit_html || framework.edit_html_for(obj, column, type, request), obj, column, type, request) 154 end
# File lib/autoforme/model.rb 168 def filter_for 169 filter || framework.filter_for(model) 170 end
# File lib/autoforme/model.rb 176 def form_attributes_for(type, request) 177 framework.form_attributes_for(model, type, request).merge(handle_proc(form_attributes, type, request) || {}) 178 end
# File lib/autoforme/model.rb 180 def form_options_for(type, request) 181 framework.form_options_for(model, type, request).merge(handle_proc(form_options, type, request) || {}) 182 end
Run given hooks with the related object and request.
# File lib/autoforme/model.rb 286 def hook(type, request, obj) 287 if type.to_s =~ /before/ 288 if v = framework.send(type) 289 v.call(obj, request) 290 end 291 if v = send(type) 292 v.call(obj, request) 293 end 294 else 295 if v = send(type) 296 v.call(obj, request) 297 end 298 if v = framework.send(type) 299 v.call(obj, request) 300 end 301 end 302 end
An array of many to many association symbols to handle inline on the edit forms.
# File lib/autoforme/model.rb 90 def inline_mtm_assocs(request) 91 normalize_mtm_associations(handle_proc(inline_mtm_associations || framework.inline_mtm_associations_for(model, request), request)) 92 end
Whether to lazy load association links for this model.
# File lib/autoforme/model.rb 220 def lazy_load_association_links?(type, request) 221 v = handle_proc(lazy_load_association_links, type, request) 222 v = framework.lazy_load_association_links?(model, type, request) if v.nil? 223 v || false 224 end
# File lib/autoforme/model.rb 196 def limit_for(type, request) 197 handle_proc(per_page || framework.limit_for(model, type, request), type, request) || DEFAULT_LIMIT 198 end
The name to use in links for this model. Also affects where this model is mounted at.
# File lib/autoforme/model.rb 241 def link 242 link_name || class_name 243 end
The underlying model class for the current model
# File lib/autoforme/model.rb 53 def model 54 if @model.is_a?(Class) 55 @model 56 elsif m = VALID_CONSTANT_NAME_REGEXP.match(@model) 57 Object.module_eval("::#{m[1]}", __FILE__, __LINE__) 58 else 59 raise Error, "invalid model for AutoForme::Model, not a class or valid constant name: #{@model.inspect}" 60 end 61 end
An array of many to many association symbols to handle via a separate mtm_edit page.
# File lib/autoforme/model.rb 75 def mtm_association_select_options(request) 76 normalize_mtm_associations(handle_proc(mtm_associations || framework.mtm_associations_for(model, request), request)) 77 end
Create a new instance of the underlying model, setting defaults based on the params given.
# File lib/autoforme/model.rb 306 def new(params, request) 307 obj = model.new 308 if params 309 columns_for(:new, request).each do |col| 310 if association?(col) 311 col = association_key(col) 312 end 313 if v = params[col.to_s] 314 obj.send("#{col}=", v) 315 end 316 end 317 end 318 obj 319 end
A human readable string representing the object.
# File lib/autoforme/model.rb 327 def object_display_name(type, request, obj) 328 apply_name_method(display_name_for, obj, type, request).to_s 329 end
# File lib/autoforme/model.rb 156 def order_for(type, request) 157 handle_proc(order || framework.order_for(model, type, request), type, request) 158 end
# File lib/autoforme/model.rb 188 def page_header_for(type, request) 189 handle_proc(page_header || framework.page_header_for(model, type, request), type, request) 190 end
# File lib/autoforme/model.rb 172 def redirect_for 173 redirect || framework.redirect_for(model) 174 end
An array of pairs for the select options to return for the given type.
# File lib/autoforme/model.rb 322 def select_options(type, request) 323 all_rows_for(type, request).map{|obj| [object_display_name(type, request, obj), primary_key_value(obj)]} 324 end
# File lib/autoforme/model.rb 148 def show_html_for(obj, column, type, request) 149 handle_proc(show_html || framework.show_html_for(obj, column, type, request), obj, column, type, request) 150 end
Whether the given type of action is supported for this model.
# File lib/autoforme/model.rb 64 def supported_action?(type, request) 65 v = (handle_proc(supported_actions || framework.supported_actions_for(model, request), request) || DEFAULT_SUPPORTED_ACTIONS).include?(type) 66 if v && type == :mtm_edit 67 assocs = mtm_association_select_options(request) 68 assocs && !assocs.empty? 69 else 70 v 71 end 72 end
Whether an mtm_edit can be displayed for the given association
# File lib/autoforme/model.rb 80 def supported_mtm_edit?(assoc, request) 81 mtm_association_select_options(request).map(&:to_s).include?(assoc) 82 end
Whether an mtm_update can occur for the given association
# File lib/autoforme/model.rb 85 def supported_mtm_update?(assoc, request) 86 supported_mtm_edit?(assoc, request) || inline_mtm_assocs(request).map(&:to_s).include?(assoc) 87 end
# File lib/autoforme/model.rb 192 def table_class_for(type, request) 193 handle_proc(table_class || framework.table_class_for(model, type, request), type, request) || DEFAULT_TABLE_CLASS 194 end