Ruby on rails 同一模型的多个视图
我是一名经验丰富的web开发人员,但对rails还不熟悉。我正在写一个基于复式记账数据库的预算应用程序。数据库包含表示交易的日记账分录,每个日记账分录都有多个过账。每笔过账都有一个账户和一笔金额 以下是我的模型的简化版本:Ruby on rails 同一模型的多个视图,ruby-on-rails,ruby-on-rails-3,Ruby On Rails,Ruby On Rails 3,我是一名经验丰富的web开发人员,但对rails还不熟悉。我正在写一个基于复式记账数据库的预算应用程序。数据库包含表示交易的日记账分录,每个日记账分录都有多个过账。每笔过账都有一个账户和一笔金额 以下是我的模型的简化版本: class Posting < ActiveRecord::Base belongs_to :account belongs_to :journal_entry attr_accessible :account_id, :amount end class
class Posting < ActiveRecord::Base
belongs_to :account
belongs_to :journal_entry
attr_accessible :account_id, :amount
end
class JournalEntry < ActiveRecord::Base
has_many :postings, :dependent => :destroy
attr_accessible :narrative, :posting_date, :postings_attributes
accepts_nested_attributes_for :postings, :allow_destroy => :true,
:reject_if => proc { |attrs| attrs.all? { |k, v| k == '_destroy' or v.blank? } }
end
类发布:销毁
属性可访问:叙述,:发布日期,:发布属性
接受以下内容的\u嵌套\u属性\u:posting,:allow\u destroy=>:true,
:如果=>proc{attrs}attrs.all{{k,v{k==''u destroy'或v.blank?},则拒绝
结束
我已经成功地创建了一个嵌套表单,它允许同时编辑日记条目及其发布列表。然而,大多数日记账分录都很简单,有一个贷方分录和一个借方分录。为了在本例中更方便地输入数据,我希望有另一个表单,允许用户只指定贷方帐户、借方帐户和金额
根据我的研究,可以看到两种方法:
处理这类事情的“rails方式”是什么?有没有其他我没有考虑过的选项?我不会使用STI来处理这个问题。基本上,您有一个简单的“视图”和一个“复杂”视图,基础模型没有变化,只是您想要呈现的视图 创建指向此简单视图的备用链接(路径/路由)并在控制器中的保存操作中管理“简单性”并没有错,您只需检查接收到的参数并决定要采取的操作
更好的是,将收到的参数传递给日志条目模型,让它处理简单或复杂保存的细节。毕竟,与会计相关的业务规则应该在模型中,不是吗?我不会使用STI来处理这个问题。基本上,您有一个简单的“视图”和一个“复杂”视图,基础模型没有变化,只是您想要呈现的视图 创建指向此简单视图的备用链接(路径/路由)并在控制器中的保存操作中管理“简单性”并没有错,您只需检查接收到的参数并决定要采取的操作
更好的是,将收到的参数传递给日志条目模型,让它处理简单或复杂保存的细节。毕竟,与会计相关的业务规则应该在模型中,不是吗?在这一点上,我不同意railsdog。我认为你确实有一个很好的STI候选人。特别是,我认为“让[JournalEntry]处理简单或复杂保存的细节”表明您正在处理两个不同的关注点 如果简单日志和复杂日志具有不同的业务逻辑,那么它们应该由两个不同的类表示。例如,不难想象,复杂JournalEntry可能想要添加简单JournalEntry没有的验证。或者,简单日志应该比复杂日志具有更少的属性可访问声明。我建议:
class JournalEntry < ActiveRecord::Base
# shared accessors and validations
end
class SimpleJournalEntry < JournalEntry
# simple accessors and validations
end
class ComplexJournalEntry < JournalEntry
# more complex accessors and validations
end
class JournalEntry
我将使用单独的控制器和视图处理这两个类
另一个不相关的注意事项是,#accepts_nested_attributes_的:all_blank选项应该与您的进程一样,不是吗?从文档中:“传递:所有属性为空而不是过程将创建一个过程,该过程将拒绝所有属性为空的记录,不包括任何“销毁”的值。”也就是说,
接受:发布的嵌套属性,:如果=>,则拒绝:所有属性为空
我不同意railsdog的这一点。我认为你确实有一个很好的STI候选人。特别是,我认为“让[JournalEntry]处理简单或复杂保存的细节”表明您正在处理两个不同的关注点
如果简单日志和复杂日志具有不同的业务逻辑,那么它们应该由两个不同的类表示。例如,不难想象,复杂JournalEntry可能想要添加简单JournalEntry没有的验证。或者,简单日志应该比复杂日志具有更少的属性可访问声明。我建议:
class JournalEntry < ActiveRecord::Base
# shared accessors and validations
end
class SimpleJournalEntry < JournalEntry
# simple accessors and validations
end
class ComplexJournalEntry < JournalEntry
# more complex accessors and validations
end
class JournalEntry
我将使用单独的控制器和视图处理这两个类
另一个不相关的注意事项是,#accepts_nested_attributes_的:all_blank选项应该与您的进程一样,不是吗?从文档中:“传递:所有属性为空而不是过程将创建一个过程,该过程将拒绝所有属性为空的记录,不包括任何“销毁”的值。”也就是说,
接受:过账的嵌套属性,:如果=>,则拒绝:所有属性为空
在日记账分录模型中如何处理?在