[Редактировать 2017-01-17] Осторожно Мой ответ старый (2012) и был для Rails 3. Он может не работать / быть идеальным для новых версий Rails.
Просто для того, чтобы привнести немного СУХОГО духа, вы можете создать универсальный метод класса, чтобы получить максимальное значение "length_validator" для любого атрибута, например, так:
Создайте модуль вкаталог lib и расширение его ActiveSupport :: Concern :
module ActiveRecord::CustomMethods
extend ActiveSupport::Concern
end
# include the extension
ActiveRecord::Base.send(:include, ActiveRecord::CustomMethods)
Добавьте в него «модуль ClassMethods» и создайте метод «get_maximum»:
module ActiveRecord::CustomMethods
extend ActiveSupport::Concern
module ClassMethods
def get_maximum(attribute)
validators_on(attribute).select{|v| v.class == ActiveModel::Validations::LengthValidator}.first.options[:maximum]
end
end
end
РЕДАКТИРОВАТЬ 1: Конфигурация
Вы также должны будете добавить требование в один из ваших инициализаторов.
Например, вот мои конфигурации:
- Я поместил свой файл в lib / modules / active_record / extensions.
- Я добавил это вmy autoload_paths:
config.autoload_paths +=
%W(#{config.root}/lib/modules)
Примечание: это не обязательно, но рекомендуется, если вы хотите поместить туда некоторые из ваших пользовательских классов и модулей, которые вы используете в своих приложениях. - В одномиз моих инициализаторов (config / initializers / custom.rb) я добавил эту строку:
require "active_record/extensions"
И это должно быть сделано!Перезагрузите сервер и затем ...
END EDIT 1
И тогда вы сможете сделать что-то вроде этого:
<%= form_for @comment do |f| %>
<%= f.text_area(:body, :maxlength => f.object.class.get_maximum(:body)) #Or just use Comment.get_maximum(:body) %>
<% end %>
Я надеюсь, что это поможет другим!:) Конечно, вы можете настроить метод так, как вы хотите, добавить опции и делать модные вещи.; -)