Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 同一模型的多个视图_Ruby On Rails_Ruby On Rails 3 - Fatal编程技术网

Ruby on 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

我是一名经验丰富的web开发人员,但对rails还不熟悉。我正在写一个基于复式记账数据库的预算应用程序。数据库包含表示交易的日记账分录,每个日记账分录都有多个过账。每笔过账都有一个账户和一笔金额

以下是我的模型的简化版本:

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?},则拒绝
结束
我已经成功地创建了一个嵌套表单,它允许同时编辑日记条目及其发布列表。然而,大多数日记账分录都很简单,有一个贷方分录和一个借方分录。为了在本例中更方便地输入数据,我希望有另一个表单,允许用户只指定贷方帐户、借方帐户和金额

根据我的研究,可以看到两种方法:

  • 单表继承,其中SimpleJournalEntry(扩展JournalEntry)
  • 使用ActiveModel创建一个不直接连接到数据库的SimpleJournalEntry模型,并自己在控制器中处理数据库更改
  • SimpleJournalEntry模型将包含贷方帐户、借方帐户和金额,并将用于编辑简单记录。现有的JournalEntry模型仍然存在,允许编辑更复杂的记录


    处理这类事情的“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选项应该与您的进程一样,不是吗?从文档中:“传递:所有属性为空而不是过程将创建一个过程,该过程将拒绝所有属性为空的记录,不包括任何“销毁”的值。”也就是说,
    接受:过账的嵌套属性,:如果=>,则拒绝:所有属性为空

    在日记账分录模型中如何处理?在