ich Ruby-Gem ich schreibe, wo ich Connection
Modul für Faraday
Konfiguration habenRubin Mixins für Best Practice suchen
module Example
module Connection
private
def connection
Faraday.new(url: 'http://localhost:3000/api') do |conn|
conn.request :url_encoded # form-encode POST params
conn.response :logger # log requests to STDOUT
conn.adapter Faraday.default_adapter # make requests with Net::HTTP
conn.use Faraday::Response::ParseJson
conn.use FaradayMiddleware::RaiseHttpException
end
end
end
end
zweiten Modul, das Anfragen API macht sieht wie folgt aus:
module Example
module Request
include Connection
def get(uri)
connection.get(uri).body
end
def post(url, attributes)
response = connection.post(url) do |request|
request.body = attributes.to_json
end
end
def self.extended(base)
base.include(InstanceMethods)
end
module InstanceMethods
include Connection
def put(url, attributes)
response = connection.put(url) do |request|
request.body = attributes.to_json
end
end
end
end
end
Klasse Cusomer
wo ich verwende Request
sieht so aus:
module Example
class Customer
extend Request
attr_accessor :id, :name, :age
def initialize(attrs)
attrs.each do |key, value|
instance_variable_set("@#{key}", value)
end
end
def self.all
customers = get('v1/customer')
customers.map { |cust| new cust }
end
def save
params = {
id: self.id,
age: self.age
name: self.name,
}
put("v1/customers/#{self.id}", params)
end
end
end
So hier sehen Sie in Customer#all
Klassenmethode Ich rufe Request#get
Methode, die verfügbar ist, weil ich Request
in Customer
erweitert. dann verwende ich self.extended Methode in Request
Modul zu machen Request#put
verfügbar in Customer
Klasse, so habe ich Frage ist dieser gute Ansatz zu Mixins wie diese zu verwenden, oder haben Sie einen Vorschlag?
Danke Josh für Antwort verwendet, aber es wenig unklar, was meinst du hören: Ich würde Ihnen empfehlen Zusammensetzung verwenden, anstatt (zB passieren in Verbindung/Request), da es mehr Sinn macht, mich in diesem Fall und hat stärkere Einkapselung. – user525717
Was Josh bedeutet, ist, dass Sie eine Connection/Request-Klasse erstellen sollten, die in Ihrer Customer-Klasse verwendet werden kann. Wenn Sie Ihren Kunden instanziieren, können Sie Ihre Request-Klasse weiterleiten, oder Sie können eine Anfrage in Ihrem Initialisierer für den Kunden instanziieren. Persönlich bevorzuge ich etwas mit Komposition b/c, dann kann ich die einzelnen Objekte einfach testen. – unflores
Unflores können Sie bitte ein Beispiel geben? – user525717