2015-01-09 67 views
0

我有一个名为Transaction的嵌套表单,其中包含一个名为Banking Information Form的子对象。当父母(交易)transaction_mechanism字段设置为“检查”时,不应触发银行信息验证。出于某种原因,当我将表单中的transaction_mechanism设置为“check”时,它仍然调用银行信息表单验证。在bank_information_form模型中,我有一个名为cheque_transaction的方法?如果transaction_mechanism是“check”,应该防止触发验证,但是我收到一个错误。在条件验证中没有给出块(yield)rails错误

错误

no block given (yield) 

transaction.rb

class Transaction < ActiveRecord::Base 
    # Require packages 
    require 'time' 

    # Associations 
    belongs_to :user 
    has_one :banking_information_form 

    # Nested attributes 
    accepts_nested_attributes_for :banking_information_form 

    # Validations 
    validates_associated :banking_information_form 
    validate :check_debit_or_credit 
    validates :transaction_mechanism, :transaction_kind, :debit, :salesforce_id, presence: true 
    validate :debit, :credit,numericality: { only_integer: true } 
end 

banking_information_form.rb

class BankingInformationForm < ActiveRecord::Base 
    # Associations 
    # Belongs to :transaction 
    belongs_to :owner, foreign_key: "transaction_id", class_name: "Transaction" 

    # Validations 
    validates :financial_institution, :transit_number, :bank_account_number, presence: true, :unless => :cheque_transaction? 
    validates :transit_number, length: {is: 5, 
            too_short: "Your transit number is 5 digits long.", 
            too_long: "Your transit number is 5 digits long."} 
    validates :bank_account_number, length: {minimum: 4, maximum: 12, 
            too_short: "Your bank account number will be between 4 and 12 digits long.", 
            too_long: "Your bank account number will be between 4 and 12 digits long."} 

    private 

    def cheque_transaction? 
     self.transaction.transaction_mechanism == "Cheque" 
    end 

结束

+0

1 “的时候,父母的(交易)transaction_mechanism字段设置为银行业信息验证应该只触发”检查“ 2.由于某种原因,当我在表单中设置transaction_mechanism为”check“时,它仍然调用银行信息表单验证“ 因此,transaction_mechanism设置为'检查'类型,所以它被调用?那么问题是什么? – Ajay 2015-01-09 23:38:58

+0

@Ajay谢谢你指出。修复这个问题是有道理的! – Questifer 2015-01-09 23:44:31

回答

0

一些经过试用和错误 - 我发现了一个方法来让我的条件验证工作。我首先将模型名称从'Transaction'更改为'AccountTransaction'。我发现'Transaction'是rails中的保留字后,我这样做是为了遵守rails的惯例。

一旦我改变了模型名称,我追加了与inverse_of::account_transaction的关联。更多可以阅读有关inverse_of here

account_transaction.rb

class AccountTransaction < ActiveRecord::Base 
    # Require packages 
    require 'time' 

    # Associations 
    belongs_to :user 
    has_one :banking_information_form, inverse_of: :account_transaction 

    # Nested attributes 
    accepts_nested_attributes_for :banking_information_form 

    # Validations 
    validates_associated :banking_information_form 
    validate :check_debit_or_credit 
    validates :transaction_mechanism, :transaction_kind, :debit, :salesforce_id, presence: true 
    validate :debit, :credit,numericality: { only_integer: true } 
end 

banking_information_form.rb

class BankingInformationForm < ActiveRecord::Base 
    # Associations 
    belongs_to :account_transaction 

    # Validations 
    validates :financial_institution, :transit_number, :bank_account_number, presence: true, :unless => :cheque_transaction? 
    validates :transit_number, length: {is: 5, 
            too_short: "Your transit number is 5 digits long.", 
            too_long: "Your transit number is 5 digits long."}, :unless => :cheque_transaction? 
    validates :bank_account_number, length: {minimum: 4, maximum: 12, 
            too_short: "Your bank account number will be between 4 and 12 digits long.", 
            too_long: "Your bank account number will be between 4 and 12 digits long."}, :unless => :cheque_transaction? 

    private 

    def cheque_transaction? 
     self.account_transaction.transaction_mechanism == "Cheque" 
    end 
end 
2
class Transaction < ActiveRecord::Base 
    has_one :banking_information_form 
    # Other code 
end 

如你所述,你的银行信息将被验证,只有当父(transcactions)机制不“检查”:

class BankingInformationForm < ActiveRecord::Base 
    belongs_to :transaction #this was missing in your code. 

    validates :financial_institution, :transit_number, 
    :bank_account_number, presence: true, unless: :cheque_transaction? 
    # other validations here 

    private 
    def cheque_transaction? 
    transaction.transaction_mechanism == "Cheque" 
    end 
end 
+0

我以前在银行信息表单模型中拥有相同的belongs_to语句,但收到大量奇怪的错误。在你的回答之后再进行一些研究之后,我认为它与'Transaction'是一个保留字在轨道中有关系吗?我可能不得不修改模型的名称。我会回复我的结果。谢谢! – Questifer 2015-01-10 16:51:39

+0

我更改了交易的型号名称并复制了您的答案,并且仍然得到相同的结果。 – Questifer 2015-01-11 15:59:40