前回のやり方だと、デフォルトの動作と切り替えるのが困難なので、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 件のコメント:
コメントを投稿