Я хотел бы добавить описания к полям модели ActiveRecord, которые будут служить базовыми инструкциями / примерами для каждого из полей. В основном метаданные модели. Затем я могу отобразить их в пользовательском интерфейсе (рядом с полями в форме и т. Д.)
Я планирую просто создать статическую хеш-таблицу внутри модели с именем поля в качестве ключа и описанием в качестве значения. Т.е.
FIELD_DESCRIPTIONS = {
'category' => 'Select the category it should appear within.',
'title' => 'The title should be a short but descriptive summary.',
'description' => 'Please enter a full description.'
}
и т.п.
Затем я бы создал базовый помощник формы, который обернул бы эти объяснения внутри диапазона (изначально скрытого и показанного через jQuery), чтобы их можно было установить через f.field_description (: title) или что-то в этом роде.
У кого-нибудь есть идеи получше? Я хотел бы сохранить метаданные этого поля в модели, поскольку многие представления могут использовать одну и ту же информацию, и я также думаю, что хорошо иметь описания в модели, когда вы вернетесь, чтобы посмотреть на код (например, как DataMapper может быть используется прямо в модели для указания полей).
Чтобы подробнее рассказать о том, что я уже сделал (и он отлично работает), вот код. Я думаю, что должен быть более красивый способ выразить эти описания в модели, поэтому дайте мне знать, если у вас есть какие-либо идеи.
В модели:
FIELD_DESCRIPTIONS = {
'category' => 'Select the category it should appear within.',
'title' => 'The title should be a short but descriptive summary.',
'description' => 'Please enter a full description.'
}
def self.describe_field(field)
FIELD_DESCRIPTIONS[field]
end
В application_helper.rb
def field_helper(form, field)
"<span class='field_helper'>#{form.object.class.describe_field(field)}</span>"
end
Ввиду:
<%= field_helper(f, 'title') %>
Это даст желаемый результат:
<span class='field_helper'>The title should be a short but descriptive summary.</span>
ОБНОВЛЕНИЕ:
Хорошо. Итак, это последний код, который я использую на основе принятого ответа.
Файл: /config/initializers/describe_attr.rb
if defined?(ActiveRecord)
# let's us add attribute descriptions to each AR model
class ActiveRecord::Base
def self.describe_attr(*params)
attrs = params.shift
unless attrs.nil?
case attrs
when Hash
@@attr_descriptions = attrs
when Symbol
return @@attr_descriptions[attrs]
end
end
@@attr_descriptions ||= {}
end
end
end
Файл: /app/models/project.rb
describe_attr(
:category => 'Select the category the project should appear within.',
:title => 'The title should be a short but descriptive summary of the project.',
:description => 'Describe the project in detail.',
:image => 'Upload an image for the project.'
)
Файл: /app/helpers/application_helper.rb
# assumes you have a style defined for attr_description
def describe_attr(form, attribute)
"<span class='attr_description'>#{form.object.class.describe_attr(attribute)}</span>"
end
Файл: /app/views/projects/_form.html.erb
<%= describe_attr(f, :title) %>