В моем проекте Rails 3.1.1 у меня есть ActiveModel, который взаимодействует с API (извлечено из книги Пола Дикса, сокращено для удобства чтения):
class Job
include ActiveModel::Validations
include ActiveModel::Serializers::JSON
ATTRIBUTES = [ :id,
:title,
:description,
:company_id ]
attr_accessor *ATTRIBUTES
validates_presence_of :title, :description
validates_numericality_of :company_id, :id
def initialize(attributes = {})
self.attributes = attributes
end
def attributes
ATTRIBUTES.inject(
ActiveSupport::HashWithIndifferentAccess.new
) do |result, key|
result[key] = read_attribute_for_validation(key)
result
end
end
def attributes=(attrs)
attrs.each_pair {|k, v| send("#{k}=", v)}
end
def read_attribute_for_validation(key)
send(key)
end
# More method definitions...
end
Я создаю @job
в моем контроллере, new
действие (company_id
- это ключ сегмента в маршруте: /companies/:company_id/jobs/new
), например:
@job = Job.new(company_id: params[:company_id])
Затем, используя CanCan, я проверяю права пользователя для создания и создания вакансии. По сути, CanCan проверяет, соответствует ли атрибут company_id
current_user заданию company_id
. Эта проверка завершается неудачно, потому что @job.company_id
возвращается как String.
Конечно, я могу использовать params [: company_id] .to_i при создании экземпляра объекта, но это похоже на обходной путь, который мне придется повторить позже.
Вопрос: есть ли способ сделать мою ActiveModel для работы более «типизированной» и заставить ее возвращать int для @job.company_id
вызова?
Я погуглил, проверил activemodel
исходный код, но, похоже, не нашел ответа. Любая помощь с благодарностью.
Обновление
Я больше думал о блоке schema
для ActiveModel, как в ActiveResource.