class ActiveScaffold::Config::Core
to fix the ckeditor bridge problem inherit from full class name
Attributes
action links are used by actions to tie together. they appear as links for each record, or general links for the ActiveScaffold.
provides read/write access to the local Actions DataStructure
enable caching of action link urls
enable caching of association options
provides read/write access to the local Columns DataStructure
enable setting ETag and LastModified on responses and using fresh_when/stale? to respond with 304 and avoid rendering views
lets you override the global ActiveScaffold frontend for a specific controller
a hash of string (or array of strings) and highlighter string to highlight words in messages. It will use highlight rails helper
a generally-applicable name for this ActiveScaffold … will be used for generating page/section headers
some utility methods
STI children models, use an array of model names
lets you specify whether add a create link for each sti child for a specific controller
enable saving user settings in session (per_page, limit, page, sort, search params)
lets you override the global ActiveScaffold theme for a specific controller
prefix messages with current timestamp, set the format to display (you can use I18n keys) or true and :short will be used
Public Class Methods
# File lib/active_scaffold/config/core.rb, line 9 def self.actions=(val) @@actions = ActiveScaffold::DataStructures::Actions.new(*val) end
must be a class method so the layout doesn't depend on a controller that uses active_scaffold note that this is unaffected by per-controller frontend configuration.
# File lib/active_scaffold/config/core.rb, line 243 def self.asset_path(filename, frontend = self.frontend) "active_scaffold/#{frontend}/#{filename}" end
# File lib/active_scaffold/config/core.rb, line 254 def self.available_frontends frontends_dir = File.join(Rails.root, 'vendor', 'plugins', ActiveScaffold::Config::Core.plugin_directory, 'frontends') Dir.entries(frontends_dir).reject { |e| e.match(/^\./) } # Get rid of files that start with . end
lets you disable the DHTML history
# File lib/active_scaffold/config/core.rb, line 43 def self.dhtml_history=(val) @@dhtml_history = val end
# File lib/active_scaffold/config/core.rb, line 46 def self.dhtml_history? @@dhtml_history ? true : false end
columns that should be ignored for every model. these should be metadata columns like change dates, versions, etc. values in this array may be symbols or strings.
# File lib/active_scaffold/config/core.rb, line 65 def self.ignore_columns @@ignore_columns end
# File lib/active_scaffold/config/core.rb, line 68 def self.ignore_columns=(val) @@ignore_columns = ActiveScaffold::DataStructures::Set.new(*val) end
must be a class method so the layout doesn't depend on a controller that uses active_scaffold note that this is unaffected by per-controller frontend configuration.
# File lib/active_scaffold/config/core.rb, line 249 def self.javascripts(frontend = self.frontend) javascript_dir = File.join(Rails.public_path, 'javascripts', asset_path('', frontend)) Dir.entries(javascript_dir).reject { |e| !e.match(/\.js$/) || (!self.dhtml_history? && e.match('dhtml_history')) } end
# File lib/active_scaffold/config/core.rb, line 222 def self.method_missing(name, *args) klass = "ActiveScaffold::Config::#{name.to_s.camelcase}".constantize rescue nil return klass if @@actions.include?(name.to_s.underscore) && klass super end
internal usage only below this point
# File lib/active_scaffold/config/core.rb, line 148 def initialize(model_id) # model_id is the only absolutely required configuration value. it is also not publicly accessible. @model_id = model_id # inherit the actions list directly from the global level @actions = self.class.actions.clone # create a new default columns datastructure, since it doesn't make sense before now attribute_names = model.columns.collect { |c| c.name.to_sym }.sort_by(&:to_s) association_column_names = model.reflect_on_all_associations.collect { |a| a.name.to_sym }.sort_by(&:to_s) @columns = ActiveScaffold::DataStructures::Columns.new(model, attribute_names + association_column_names) # and then, let's remove some columns from the inheritable set. content_columns = Set.new(model.content_columns.map(&:name)) @columns.exclude(*self.class.ignore_columns) @columns.exclude(*@columns.find_all { |c| c.column && content_columns.exclude?(c.column.name) }.collect(&:name)) @columns.exclude(*model.reflect_on_all_associations.collect { |a| a.foreign_type.to_sym if a.options[:polymorphic] }.compact) # inherit the global frontend @frontend = self.class.frontend @theme = self.class.theme @cache_action_link_urls = self.class.cache_action_link_urls @cache_association_options = self.class.cache_association_options @conditional_get_support = self.class.conditional_get_support @store_user_settings = self.class.store_user_settings @sti_create_links = self.class.sti_create_links # inherit from the global set of action links @action_links = self.class.action_links.clone @timestamped_messages = self.class.timestamped_messages @highlight_messages = self.class.highlight_messages end
access to the permissions configuration. configuration options include:
* current_user_method - what method on the controller returns the current user. default: :current_user * default_permission - what the default permission is. default: true
# File lib/active_scaffold/config/core.rb, line 59 def self.security ActiveScaffold::ActiveRecordPermissions end
Public Instance Methods
To be called after your finished configuration
# File lib/active_scaffold/config/core.rb, line 191 def _configure_sti column = model.inheritance_column if sti_create_links columns[column].form_ui ||= :hidden else columns[column].form_ui ||= :select columns[column].options ||= {} columns[column].options[:options] = sti_children.collect do |model_name| [model_name.to_s.camelize.constantize.model_name.human, model_name.to_s.camelize] end end end
To be called after your finished configuration
# File lib/active_scaffold/config/core.rb, line 182 def _load_action_columns # then, register the column objects actions.each do |action_name| action = send(action_name) action.columns.set_columns(columns) if action.respond_to?(:columns) end end
# File lib/active_scaffold/config/core.rb, line 90 def actions=(args) @actions = ActiveScaffold::DataStructures::Actions.new(*args) end
# File lib/active_scaffold/config/core.rb, line 122 def add_sti_create_links? sti_create_links && !sti_children.nil? end
# File lib/active_scaffold/config/core.rb, line 96 def columns=(val) @columns._inheritable = val.collect(&:to_sym) # Add virtual columns @columns << val.collect { |c| c.to_sym unless @columns[c.to_sym] }.compact end
# File lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb, line 27 def configure_file_column_field(field) # set list_ui first because it gets its default value from form_ui columns[field].list_ui ||= model.field_has_image_version?(field, 'thumb') ? :thumbnail : :download_link_with_filename columns[field].form_ui ||= :file_column # these 2 parameters are necessary helper attributes for the file column that must be allowed to be set to the model by active scaffold. columns[field].params.add "#{field}_temp", "delete_#{field}" # set null to false so active_scaffold wont set it to null # delete_file_column will take care of deleting a file or not. model.columns_hash[field.to_s].instance_variable_set('@null', false) rescue false end
warning - this won't work as a per-request dynamic attribute in rails 2.0. You'll need to interact with Controller#generic_view_paths
# File lib/active_scaffold/config/core.rb, line 237 def inherited_view_paths @inherited_view_paths ||= [] end
# File lib/active_scaffold/bridges/calendar_date_select/as_cds_bridge.rb, line 3 def initialize_with_calendar_date_select(model_id) initialize_without_calendar_date_select(model_id) calendar_date_select_fields = model.columns.collect { |c| c.name.to_sym if [:date, :datetime].include?(c.type) }.compact # check to see if file column was used on the model return if calendar_date_select_fields.empty? # automatically set the forum_ui to a file column calendar_date_select_fields.each { |field| columns[field].form_ui = :calendar_date_select } end
# File lib/active_scaffold/bridges/file_column/as_file_column_bridge.rb, line 8 def initialize_with_file_column(model_id) initialize_without_file_column(model_id) return unless ActiveScaffold::Bridges::FileColumn::FileColumnHelpers.klass_has_file_column_fields?(model) model.send :extend, ActiveScaffold::Bridges::FileColumn::FileColumnHelpers # include the "delete" helpers for use with active scaffold, unless they are already included model.generate_delete_helpers # switch on multipart update.multipart = true create.multipart = true model.file_column_fields.each { |field| configure_file_column_field(field) } end
# File lib/active_scaffold/config/core.rb, line 131 def label(options = {}) as_(@label, options) || model.model_name.human(options.merge(options[:count].to_i == 1 ? {} : {:default => model.name.pluralize})) end
configuration routing. we want to route calls named like an activated action to that action's global or local Config class.
# File lib/active_scaffold/config/core.rb, line 207 def method_missing(name, *args) @action_configs ||= {} titled_name = name.to_s.camelcase underscored_name = name.to_s.underscore.to_sym klass = "ActiveScaffold::Config::#{titled_name}".constantize rescue nil if klass if @actions.include? underscored_name return @action_configs[underscored_name] ||= klass.new(self) else raise "#{titled_name} is not enabled. Please enable it or remove any references in your configuration (e.g. config.#{underscored_name}.columns = [...])." end end super end
# File lib/active_scaffold/config/core.rb, line 232 def model @model ||= @model_id.to_s.camelize.constantize end