【发布时间】:2011-10-27 17:25:39
【问题描述】:
在我的 Rails 3.1.1 项目中,我有一个与 API 对话的 ActiveModel(摘自 Paul Dix 的书,为便于阅读而缩短了):
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 检查 current_user 的 company_id 属性是否与作业的 company_id 匹配。此检查失败,因为 @job.company_id 作为字符串返回。
当然,我可以在实例化对象时使用 params[:company_id].to_i,但这似乎是一种我以后必须重复的解决方法。
问题:有没有办法让我的 Job ActiveModel 更加“类型感知”,并让它为 @job.company_id 调用返回 int?
我四处搜索,检查了activemodel 源代码,但似乎没有找到答案。非常感谢任何帮助。
更新
我正在考虑更多类似于 ActiveModel 的 schema 块,就像 ActiveResource 中的块一样。
【问题讨论】:
标签: ruby-on-rails ruby-on-rails-3 type-conversion activemodel