加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 跨多个(逻辑)层传递对象的’Rails方式’是什么

发布时间:2020-12-17 02:09:06 所属栏目:百科 来源:网络整理
导读:我来自.NET世界,我正在试图找出在多层应用程序中跨层传递对象的’Rails方式’. 我正在撰写多操作符定价API.基本上在我的价格控制器中,我可以访问以下参数params [:carrier],params [:address_from],params [:address_to],params [:container_type]等.我
我来自.NET世界,我正在试图找出在多层应用程序中跨层传递对象的’Rails方式’.

我正在撰写多操作符定价API.基本上在我的价格控制器中,我可以访问以下参数params [:carrier],params [:address_from],params [:address_to],params [:container_type]等.我有一个验证库,一个合规库和一个价格-finder库,每个处理一个params的子集.

在.NET中,params将被包含在数据传输对象(DTO)或契约中.在调用任何库之前,它们将被转换为域对象(DO),并且每个库都可以在DO上工作,从而避免在DTO上紧密耦合. Ruby编程推荐使用’duck typing’,因此我的库可以直接在params上工作(即使你会访问符号而不是对象/属性).或者我应该将我的params编组到一个PriceRequest对象中并使我的库在PriceRequest类型上工作?

选项1:

class PricesController < ApplicationController
  def get
    CarrierValidator.validate(params)
    ...
  end
end

class CarrierValidator
  def self.validate(params)
    raise CarrierError if !Carrier.find_by_name(params[:carrier_name]).exists?
  end
end

选项2:

class PricesController < ApplicationController
  def get
    pricesRequest = PricesRequest.new(carrier_name: params[:carrier_name],...)
    pricesRequest.validate
    ...
  end
end

class PriceRequest
  attr_accessor : ...

  def initalize
    ...
  end

  def validate
    CarrierValidator.validate(self.carrier_name)
  end
end

class CarrierValidator
  def self.validate(carrier_name)
    raise CarrierError if !Carrier.find_by_name(carrier_name).exists?
  end
end

TIA,
?

解决方法

你应该创建一个类型.我会使用ActiveModel来封装数据(属性)和业务逻辑(验证和可能是一些用于处理数据的特定于层的方法).

基本上,您希望能够在控制器中执行Rails-y操作,例如:

def get
  price_request = PriceRequest.new(params[:price_request])

  if price_request.valid?
     # do something like redirect or render
  else
     # do something else
  end
end

所以你要声明:

class PriceRequest
  include ActiveModel::Model

  attr_accessor :carrier,:address_from,:address_to,:container_type

  validates :carrier,presence: true
  validate :validate_address_from

  def validate_address_from
    # do something with errors.add
  end

  # and so on

这是一个很好的起点:http://edgeguides.rubyonrails.org/active_model_basics.html

API中的更多细节:http://api.rubyonrails.org/classes/ActiveModel/Model.html

希望能指出你正确的方向……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读