【问题标题】:ruby on rails architecture model, view and DTOsruby on rails 架构模型、视图和 DTO
【发布时间】:2019-06-09 18:28:28
【问题描述】:

我是一名 .NET 人员,我试图了解 Rails 及其 Active Record 背后的概念。

正如我在所有示例中看到的,他们总是假设您的视图是模型的 1:1 副本。实际上,这通常不是真的。

类似于包含客户与该客户相关的联系人的视图。用户应该能够在一个视图中同时编辑(客户和联系人)

在每个示例中,我看到它们将视图直接绑定到一个 activerecord 对象。模型、验证等所有内容都绑定到一个直接映射到数据库的对象。

Rails 专家能否解释一下在复杂模型情况下的现实应用程序中使用 Active Record 的优雅方式是什么?一开始我在考虑 DTO,但我无法想象这是使用 Rails 的方式。

【问题讨论】:

    标签: ruby-on-rails


    【解决方案1】:

    同意约翰....

    您问:“就像一个包含客户和与该客户无关的联系人的视图。用户应该能够在一个视图中编辑两者(例如客户和联系人)”

    好的,这是一个有一些员工的客户模型,对吧?如果不是,请将“Employee”替换为“Person”

    /app/model/customer.rb

    Class Customer < ActiveRecord::Base
      has_many :employees
      accepts_nested_attributes_for :employees
    end
    

    /app/model/employee.rb

    Class Employee < ActiveRecord::Base
      belongs_to :customer
    end
    

    那么在您的客户看来 /app/views/customers/show.html.erb

    <%= form_for(@customer) do |f| %>
    
     <%= f.text_field :name %>
     .... yada yada ....
    
     <%= f.fields_for(:employees) do |ef| } %>
        <%= ef.text_field :first_name%>
        <%= ef.text_field :phone %>
     <% end %>
    
    <%= f.submit %>
    
    <% end %>
    

    上面有 1 个表单,可让您保存客户及其员工。称为嵌套表单,我认为需要“视图模型”。

    如果你只是按照现实生活的分组方式来分组,那就很简单了。

    【讨论】:

    • 没关系,因为它们是相关的,但如果它们不相关怎么办?是否可以在一个表单中使用 form_for(@customer) 和 form_for(@employee)?
    • 当然可以。这可能会在某种仪表板控制器上结束,但您可以在 HTML 页面上拥有两个或更多表单。
    【解决方案2】:

    因为 Rails 使用 MVC 架构,所以完全有可能(而且通常很常见)有一个控制器来协调多个模型并将它们提供给视图进行渲染。

    我认为考虑数据传输对象是一条死胡同,因为它们只是愚蠢的数据持有者,而 Rails 中的 ActiveRecord 模型更聪明。他们有相关的模型(我知道 DTO 可以与其他 DTO 有结构关系)、自定义查找器方法和验证逻辑。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-10-09
      • 1970-01-01
      • 2012-03-29
      • 1970-01-01
      • 2012-06-02
      • 1970-01-01
      • 2015-09-19
      • 2020-04-23
      相关资源
      最近更新 更多