rails验证错误未定义方法'x'表示Model

时间:2013-11-17 03:40:29

标签: ruby-on-rails validation activerecord

在我的ActiveRecord付款模式中,我有:

attr_accessible :amount, :client_id, :confirmation_id, :method, :plan_id, :firstname, :lastname, :address1, :city, :state, :zip, :expiremonth, :expireyear, :cardnumber, :cvv2
validates :firstname, presence: true
validates :lastname, presence: true
validates :address1, presence: true
validates :city, presence: true
validates :state, presence: true
validates :zip, presence: true, numericality: true
validates :expiremonth, presence: true
validates :expireyear, presence: true
validates :cardnumber, presence: true, numericality: true
validates :cvv2, presence: true, numericality: true
validates :plan_id, presence: true, numericality: true

其中大多数是通过'belongs_to:client'关联的属性。包括:国家。 但是,:cardnumber和:cvv2不是......它们必须以某种方式进行验证。

在我的付款 - 购物车视图中我有:

<%= form_for @payment, :url => { action: "checkout" } do |f| %>
<%= f.hidden_field(:plan_id, :value => @plan.id) %>
<%= f.text_field :firstname, :value => @client.firstname %>
...More form field tags like this....
<%= f.collection_select :state, State.all, :statecode, :state %>
...More form field tags...
<%= f.text_field :cardnumber %>

但是,'f。'似乎不适用于:state,:cardnumber,:cvv2因为当我尝试访问购物车页面时,我得到“未定义方法'状态'或'cardnumber'或'cvv2'。如果我有f。那么确保它得到验证。

问题1 =为什么我收到错误:状态?当它像大多数其他工作领域一样是客户端模型的一部分时。我是否错误地设置了collection_select?

* 问题2 =如何设置其他“虚拟”属性(如果这是正确的术语),如:cardnumber和:cvv2要验证而不会得到与状态相同的错误。 (未定义的方法)*

2 个答案:

答案 0 :(得分:0)

所以看起来你需要制作一个嵌套形式,因为:state不是@payment的属性,而是@client的属性。您之前的字段工作的原因是因为您将它们的值定义为@ client.attribute而不是简单地:attribute。对于我要做的所有客户端属性

f.fields_for :client do |ff|

答案 1 :(得分:0)

我将此添加到我的模型中: 对于VirtualAttributes而言似乎已经解决了这个问题。

    attr_accessor :expiremonth, :expireyear, :cardnumber, :cvv2

我在她的回答中直接从@client @ussferox建议中提取其他属性。

但是,使用正确的默认数据填充它们并允许该数据持续存在并进行验证是其他问题。但这是另一次。