2016-04-13 6 views
4

私は.NETの世界から来ており、多層アプリケーションで層をまたがってオブジェクトを渡すために 'Rails Way'が何を出すのか把握しようとしています。マルチ(論理)層にオブジェクトを渡すための 'Rails Way'は何ですか?

私はマルチキャリアプライシングAPIを作成しています。基本的に私の価格コントローラで、私は次のパラメータへのアクセス権を持っているのparams [:キャリア]のparams [:address_from]のparams [:address_to]のparams [:CONTAINER_TYPE]、など私が検証を持っていますライブラリ、コンプライアンスライブラリ、および価格決定ライブラリから構成され、それぞれがパラメータのサブセットを処理します。

.NETでは、パラメータはデータ転送オブジェクト(DTO)または契約にエンパセスされます。いずれかのライブラリを呼び出す前に、それらはドメインオブジェクト(DO)に変換され、各ライブラリはDOで動作するため、DTOでの緊密な結合が回避されます。 Rubyのプログラミングでは「ダックタイピング」の使用を推奨しています。そのため、私のライブラリは(たとえあなたがシンボルにアクセスしてもオブジェクト/プロパティではなくても)直接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、
J

+0

ここにサンプルコードを投稿できますか? –

答えて

1

あなたはタイプを作成する必要があります。データ(属性)&ビジネスロジックを検証するためにActiveModelを使用します(データの処理にいくつかのレイヤ固有の方法があるかもしれません)。そう、あなたが宣言したい

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 

これは、開始するには良い場所です

は基本的に、あなたのようなコントローラーでのRails-yの物事を行うことができるようにしたいです: APIでhttp://edgeguides.rubyonrails.org/active_model_basics.html

詳細:http://api.rubyonrails.org/classes/ActiveModel/Model.html

正しい方向を指してくれることを願っています...

+0

json_schema jsonの検証にjson_schema gemを使用することを選択しました。これは、PriceRequestの検証ルールの一部を処理します。しかし、より複雑な検証ビジネスルールがまだPriceRequestに入っているので、あなたが提案したものを無効にしないと思いますか?また、このファイルはどこに置くのですか?/app/models、/ app/business_models、/ libまたは/ lib/domain_objects? –

+0

ええ、モデルを使ってjson_schema call/configをラップすることができます。app/modelsはうまくいきます。それはあなた次第です。アプリの下に任意のディレクトリを置くことができます。 –

関連する問題