Domanda

Sto utilizzando ActiveResource in Rails per gestire entità in un database separato su REST.

Ho cercato di gestire esplicitamente gli ID delle risorse remote, poiché nel caso attuale è più semplice riutilizzare l'ID della risorsa locale, piuttosto che mantenere un campo diverso.

Sfortunatamente non sono stato in grado di farlo funzionare perché il codice per new? in ActiveResource :: Base è

  def new?
    id.nil?
  end

e salva è

 def save
   new? ? create : update
 end

Quindi da quello per definizione è impossibile impostare un ID di una risorsa e salvarlo come nuova risorsa.

create e update sono metodi protetti, quindi se avessi violato il codice ActiveResource :: Base forse questo avrebbe funzionato, ma non sopporto di farlo.

Esiste un modo corretto di farlo? O è quello che sto cercando di fare solo male, e non dovrei farlo?

È stato utile?

Soluzione

Stai lavorando contro le intenzioni di ActiveResource. ActiveResource fornisce un'interfaccia ai servizi web REST, che per convenzione restituiscono l'ID assegnato quando si esegue una creazione.

Detto questo, se controlli la risorsa che stai utilizzando e ne hai modificato il comportamento per prendere un ID durante il salvataggio di un nuovo record, puoi modificare ActiveResource :: Base per renderlo conforme. Non è inusuale per le persone in Rails apportare aggiunte e modifiche alle classi di base; hai appena messo la tua patch in lib e includila da qualche parte nelle tue cose di avvio.

Non credo sia necessariamente una buona idea, ma è possibile. :)

Altri suggerimenti

In nuove rotaie (testato 2.3.2) è possibile impostare id, poiché la logica di salvataggio è cambiata un po '(ora i record hanno un campo booleano @newrecord per eliminare quell'id.nil?).

record = Model.new
record.id = 123
record.save!
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top