Skip to content

Column Overrides (List)

Sergio Cambra edited this page Oct 10, 2013 · 3 revisions

If you want to customize the presentation of a column, you can define a specially named method in your helper file. The format is #{class_name}_#{column_name}_column or #{column_name}_column. So, for example, to customize the :username column displayed on your UsersController, you would add a user_username_column method to your UsersHelper file. If you want to override username columns in all models, add a username_column method to your ApplicationHelper file.

In v2.3 and previous versions format was only #{column_name}_column, so method was named username_column.

This override method accepts two arguments: the entire record object and the column. It is your responsibility to retrieve the interesting value from the record.

Before version 3.3, the override method accepted only a single method, the record object, so would be defined for example as “def phone_column(record)”. Since version 3.3 this would be written “def phone_column(record, column)”.

This override method is used by List and Show.

Example:

class User < ActiveRecord::Base
  has_many :roles
end

module UsersHelper
  # joins the first three roles with a hyphen instead of the normal comma.
  # ok, so this one isn't very original.
  def user_roles_column(record, column)
    if record.roles.any?
      record.roles.first(3).collect{|role| h(role)}.join(' - ')
    else
      # This way there's something to turn into a link if there are no roles associated with this record yet.
      active_scaffold_config.list.empty_field_text
    end
  end

  # creates a popup link to the associated division (belongs_to association)
  def user_division_column(record, column)
    link_to(h(record.division.name), :action => :show, :controller => 'divisions', :id => record.division.id)
  end
end

Adding html attributes for cells

Cells in records table already has a class attribute, and you can add more classes with column#css_class. If you want to add other html attributes, such as title attribute, you have to define a method in your helper named #{class_name}_#{column_name}_column_attributes or #{column_name}_column_attributes. This method accepts one argument: the entire record object, and must return a hash with html attributes, as used in rails helpers.

module UsersHelper
  def user_roles_column_attributes(record)
    {:title => "Click to edit roles"}
  end
end

Also you can override column_attributes method, which gets two arguments: column object and record object.

module UsersHelper
  def column_attributes(column, record)
    if column == :roles
      {:title => "Click to edit roles"}
    else
      {:title => column.label}
    end
  end
end

And you can override column_attributes method in your ApplicationHelper file to provide some defaults, or to disable the feature, avoiding some respond_to? calls

module ApplicationHelper
  # set some default attributes and merge them with specific attributes for the column
  def column_attributes(column, record)
    {:title => "#{record.to_label} - #{column.label}"}.merge(super)
  end

  # disable column attributes, avoiding respond_to? methods
  def column_attributes(column, record)
    {}
  end
end
Clone this wiki locally