2013-08-17 3 views
2

В моей суб-лицевом бухгалтерские рельсы приложения У меня есть модельRails с использованием fields_for

class Fund < ActiveRecord::Base 
    belongs_to :agency 
    has_many :gl_accounts 

    accepts_nested_attributes_for :gl_accounts 

    attr_accessible :name, :agency_id, :fund, :user_stamp, :active 
    attr_accessible :gl_accounts_attributes 

фондов и модель gl_accounts

class GlAccount < ActiveRecord::Base 
    belongs_to :agency 
    belongs_to :fund 
    has_many :class_sessions 
    has_many :facilities 

    validates :agency_id, :fund_id, :name, :gl_account_number, :active, :user_stamp, :account_type, :presence => true 
    validates_uniqueness_of :account_type, :scope => :fund_id, :if => :unique_account_type 

    attr_accessible :agency_id, :fund_id, :name, :gl_account_number, :active, :user_stamp, :account_type 

    def unique_account_type 
     [3,4,6,7,8].include? account_type 
    end 

При создании нового фонда есть 5 gl_accounts что должен быть создан одновременно, поэтому я использую fields_for для создания 5 новых записей в модели gl_account, когда новая запись создается для фонда. Кажется, все работает нормально, пока я не отправлю форму, и я получаю сообщение о том, что «Фонд счетов Gl не может быть пустым».

В модели gl_accounts нет атрибута "fund". Я подумал, что, возможно, рельсы отбрасывают часть «_id» (поскольку есть поле foreign_id foreign key), но я был в понимании, что использование вложенных моделей и fields_for автоматически добавляет правильное значение в поле fund_id (внешний ключ gl_account модель). Но даже если я добавлю скрытое поле в форму со значением для fund_id, я все равно получаю сообщение о том, что «фонд» не может быть пустым.

Итак, возможно, рельсы пытаются сказать мне, что у меня что-то еще не так?

Вот Титулы:

{"utf8"=>"✓", 
"authenticity_token"=>"MNWLFOnLOE+ZRsUf9mogf2cq/TeQ+mxtrdaVu3bEgpc=", 
"fund"=>{"agency_id"=>"1", 
"user_stamp"=>"6", 
"name"=>"Junk", 
"fund"=>"44", 
"active"=>"1", 
"gl_accounts_attributes"=>{"0"=>{"agency_id"=>"1", 
"user_stamp"=>"6", 
"account_type"=>"6", 
"name"=>"Cash Account", 
"active"=>"1", 
"fund_id"=>"1", 
"gl_account_number"=>"44-498-965-789"}, 
"1"=>{"agency_id"=>"1", 
"user_stamp"=>"6", 
"account_type"=>"7", 
"name"=>"Credit Card Account", 
"active"=>"1", 
"fund_id"=>"1", 
"gl_account_number"=>"44-498-965-163"}, 
"2"=>{"agency_id"=>"1", 
"user_stamp"=>"6", 
"account_type"=>"3", 
"name"=>"Customer Account Balances", 
"active"=>"1", 
"fund_id"=>"1", 
"gl_account_number"=>"44-498-965-254"}, 
"3"=>{"agency_id"=>"1", 
"user_stamp"=>"6", 
"account_type"=>"8", 
"name"=>"Refunds Pending Account", 
"active"=>"1", 
"fund_id"=>"1", 
"gl_account_number"=>"44-498-965-456"}, 
"4"=>{"agency_id"=>"1", 
"user_stamp"=>"6", 
"account_type"=>"4", 
"name"=>"Deferred Revenue Account", 
"active"=>"1", 
"fund_id"=>"1", 
"gl_account_number"=>"44-498-965-159"}}}, 
"commit"=>"Add New Fund"} 
+0

Как вы относитесь к этим параметрам? – snowangel

+0

@snowangel - я вернулся и включил параметры в исходное сообщение. Как вы можете видеть, в параметрах для каждой записи создается файл fund_id. – circle1

ответ

2

Try удаление fund_id от присутствия истинного утверждения в классе GlAccount.

validates :agency_id, :name, :gl_account_number, :active, :user_stamp, :account_type, :presence => true 

А также не добавляют fund_id, как скрытое поле, потому что, вы правы, «fields_for» автоматически позаботится о том, но что будет после валидаций.

Так что вам не требуется fund_id для проверки на наличие.

Update

Кроме того, чтобы гарантировать, что fund_id никогда не обнулить вы можете поставить ограничение в таблице базы данных. Создайте миграцию со следующим кодом.

change_column :gl_accounts, :fund_id, :integer, :null => false 

Update 2

Для обеспечения того, чтобы фонд там вам нужно проверить на наличие фонда не fund_id.

validates :fund, :presence => true 

И для этого вам необходимо объявить свои ассоциации с помощью «inverse_of», как показано ниже.

class Fund < ActiveRecord::Base 
    has_many :gl_accounts, inverse_of: :fund 
    accepts_nested_attributes_for :gl_accounts 
end 

class GlAccount < ActiveRecord::Base 
    belongs_to :fund, inverse_of: :gl_accounts 
    validates_presence_of :fund 
end 

Для получения дополнительной информации см. Это руководство. http://api.rubyonrails.org/classes/ActiveRecord/NestedAttributes/ClassMethods.html#label-Validating+the+presence+of+a+parent+model

+0

Спасибо. Удаление fund_id из проверки позволило ему работать. (У меня только есть fund_id в параметрах в качестве теста) Теперь это работает как запланировано ... кроме - теперь я нервничаю, потому что gl_accounts также могут быть созданы независимо от создания фонда и абсолютно должны иметь fund_id, или это катастрофа. Вот почему у меня была модель, подтверждающая наличие.Итак, теперь мне просто нужно выяснить, как обеспечить наличие fund_id, если gl_account создается в новом/создающем действии непосредственно в модели gl_accounts. – circle1

+0

Я думаю, чтобы гарантировать, что fund_id никогда не является нулевым, лучший способ - добавить ограничение в базу данных. Я обновлю ответ. – Bot

+0

Да, я уже это сделал. Мне просто нужно ловушку для этой ошибки db. Плюс, я полагаю, что я могу использовать валидацию JavaScript в форме, чтобы уменьшить вероятность ее появления на уровне дБ без fund_id. – circle1

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