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
しましたが、答えが見つからないようです。どんな助けでも大歓迎です。
更新schema
ActiveResourceのブロックのように、ActiveModelのブロック
のようなものをもっと考えていました。