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を使用して、作成するユーザーの権限を確認してジョブを作成します。company_id基本的に、CanCanはcurrent_userの属性がjobの属性と一致するかどうかをチェックしますcompany_id。@job.company_id文字列として返されるため、このチェックは失敗します。
確かに、オブジェクトをインスタンス化するときにparams [:company_id] .to_iを使用できますが、これは後で繰り返す必要がある回避策のようです。
質問:@job.company_idジョブActiveModelをより「タイプ認識」にして、呼び出し に対してintを返すようにする方法はありますか?
グーグルでソースコードをチェックactivemodelしましたが、答えが見つからないようです。どんな助けでも大歓迎です。
更新schemaActiveResourceのブロックのように、ActiveModelのブロック
のようなものをもっと考えていました。