2015-01-09 2 views
0

У меня есть вложенная форма, называемая транзакцией, которая включает дочерний объект, называемый формой банковской информации. Валидации банковской информации не следует инициировать, когда поле транзакции (транзакции) родительской (транзакции) установлено на «проверка». По какой-то причине, когда я задал транзакционный_механизм для «проверки» в форме, он все еще вызывает валидации формы банковской информации. В модели bank_information_form у меня есть метод cheque_transaction? что должно препятствовать запуску проверки, если транзакция_механизм «проверяется», но я получаю сообщение об ошибке.Отсутствие блока (выход) ошибка рельсов при условной проверке

Ошибка

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 родителя установлен в положение" check ". 2. По какой-то причине, когда я задал транзакционный_механизм для« проверки »в форме, он по-прежнему вызывает форму банковской информации валидации " Итак, для параметра transaction_mechanism задано значение 'check', чтобы оно вызывалось? что это за проблема? – Ajay

+0

@ Ajay Спасибо за указание этого. Исправлен вопрос, чтобы иметь смысл! – Questifer

ответ

0

После еще несколько проб и error- я нашел способ получить мою условную валидацию для работы. Сначала я изменил название модели с «Транзакция» на «AccountTransaction». Я сделал это, чтобы выполнить соглашения о рельсах после того, как узнал, что «Транзакция» - это зарезервированное слово в рельсах.

Как только я изменил имя модели, я добавил свою связь с 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) механизм родителя не «Check»:

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 в форме формы банковской информации, но получил массу странных ошибок. После нескольких исследований после вашего ответа я думаю, что это связано с тем, что «Транзакция» является зарезервированным словом в рельсах? Возможно, мне придется изменить имя модели. Я отправлю обратно с моими результатами. Благодаря! – Questifer

+0

Я изменил название модели Transaction и скопировал ваш ответ, и я все равно получаю тот же результат. – Questifer

Смежные вопросы