Ruby on rails rails验证错误未定义方法';x';模型

Ruby on rails rails验证错误未定义方法';x';模型,ruby-on-rails,validation,activerecord,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 :la

在我的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
其中大多数是通过“属于:客户机”关联的属性。包括:国家。 但是,:cardname和: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 %>
{action:“checkout”}do | f |%>
@计划id)%>
@client.firstname%>
…更多像这样的表单字段标记。。。。
…更多表单字段标记。。。
但是,对于:state、:cardnumber、:cvv2,“f.”似乎不起作用,因为我在尝试访问购物车页面时得到了“未定义的方法”state或“cardnumber”或“cvv2”。如果我有“f.”,则确保它得到验证

问题1=为什么我在:state?上出现错误?当它与大多数其他字段一样是客户端模型的一部分时。我是否设置了集合\u选择错误?


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

因此,看起来您需要创建一个嵌套表单,因为:state不是@payment的属性,而是@client的属性。您以前的字段之所以有效,是因为您将它们的值定义为@client.attribute,而不是简单的:attribute。对于所有客户端属性,我都会这样做

f.fields_for :client do |ff|
我将此添加到我的模型中: 对于VirtualAttributes,它似乎已经解决了这个问题

    attr_accessor :expiremonth, :expireyear, :cardnumber, :cvv2
我在她的回答中直接从@client per@ussferox建议中提取其他属性


但是,使用正确的默认数据填充它们并允许该数据持久化和验证是其他问题。但这是另一个问题。

您需要为它们提供方法。您是否运行了最近的迁移?所有最近的迁移都已运行。问题2如何?这对需要从客户端数据填充的属性有效。这是一个单独的问题,但您知道如何允许模型验证这些属性吗?例如,现在我有
,如果我清空“payment”=>{“client”=>{“zip”字段,我会从表单中得到这个结果"=>""…但是..当然
验证:zip,presence:true,numericality:true
不会验证这一点。为什么不改为在客户端模型中验证它们呢?或者,您可以在保存之前进行一次支付回调,上面写着:检查\u client\u字段的\u validity\u,然后定义它。我不确定是否有直接验证客户端属性的方法但是在支付模型中是这样的。如果你想确保这些东西正好存在,在支付模型中,你可以说accepts_nested_attributes_for:client,reject_if::all_blank(或者另一个reject_if proc-see)如何在客户端模型中验证它们?我不熟悉这一点。