2010年6月18日金曜日

FormHelper の汚染に対応(2)

 FormHelperの汚染に対応の続きです。
 前回のやり方だと、デフォルトの動作と切り替えるのが困難なので、activescaffold に新たにオーバーライドするかどうかをチェックするためのヘルパを加えてみました。

lib/active_scaffold/helpers/form_column_helpers.rb です。
まず下準備としてメソッドを追加します。

def override_form_field_will_do?(column)
respond_to?(override_form_field_will_do(column))
end

def override_form_field_will_do(column)
"#{column.name}_form_column_will_do"
end

次に、active_scaffold_input_for を改造します

module FormColumnHelpers
# This method decides which input to use for the given column.
# It does not do any rendering. It only decides which method is responsible for rendering.
def active_scaffold_input_for(column, scope = nil, options = {})
begin
will_do = true
options = active_scaffold_input_options(column, scope, options)
options = javascript_for_update_column(column, scope, options)
# prepare, check if form_field will be override?
if override_form_field_will_do?(column)
will_do = send(override_form_field_will_do(column), @record, options)
end
# first, check if the dev has created an override for this specific field
if will_do and override_form_field?(column)
send(override_form_field(column), @record, options)
# second, check if the dev has specified a valid form_ui for this column
elsif column.form_ui and override_input?(column.form_ui)
send(override_input(column.form_ui), column, options)
# fallback: we get to make the decision
else
....


同様に list_column_helper.rb も改造します

module ListColumnHelpers
def get_column_value(record, column)
begin
will_do = true
if column_override_will_do? column
will_do = send(column_override_will_do(column), record)
end
# check for an override helper
value = if will_do and column_override? column
......


def column_override_will_do(column)
"#{column.name.to_s.gsub('?', '')}_column_will_do"
# parse out any question marks (see issue 227)
end

def column_override_will_do?(column)
respond_to?(column_override_will_do(column))
end




 これで、FormHelper にて



def name_column_will_do
record.is_a? Customer
end

def name_column(record)
"<a href='mailto:" + record[:email_address].to_s + "'>" + record[:name].to_s + "</a>";
end



と、汚染に対する耐性が簡単に実装できました。

0 件のコメント: