2013-10-21 6 views
10

Ho letto la differenza tra le richieste put e post e ho alcune domande correlate relative alle guide: vorrei cambiare un campo specifico in una riga già creata ... dovrei usa una put o una richiesta di posta? Ad esempio sono i seguenti diversi?Rotaie Put vs Post

#Assume this is a put request 
def update 
    @model=Model.find(x) 
    @model.field="new_field" 
    @model.save 
end 

#Assume this is a post request 
def update 
    @model=Model.find(x) 
    @model.field="new_field" 
    @model.save 
end 

#What if I use the rails update method? 
def update 
    @model=Model.find(x) 
    @model.update(model_params) 
    @model.save 
end 

Grazie in anticipo.

+0

Partenza [questo] (http://stackoverflow.com/questions/107390/whats-the-difference-between-a-post-and-a- put-http-request), la tua domanda ha più a che fare con le definizioni HTTP e il loro uso intenend delle convenzioni delle rotaie ... – rudolph9

risposta

17

Secondo rotaie convenzione,

PUT viene utilizzato per aggiornare una risorsa esistente

POST viene utilizzato per creare una nuova risorsa

In rotaie 4, PUT è modificata per PATCH per evitare confusione .

Rails generato percorsi sarà simile al di sotto di default

posts GET /posts(.:format)       {:action=>"index", :controller=>"posts"} 
      POST /posts(.:format)       {:action=>"create", :controller=>"posts"} 
new_post GET /posts/new(.:format)      {:action=>"new", :controller=>"posts"} 
edit_post GET /posts/:id/edit(.:format)     {:action=>"edit", :controller=>"posts"} 
    post GET /posts/:id(.:format)      {:action=>"show", :controller=>"posts"} 
      PUT /posts/:id(.:format)      {:action=>"update", :controller=>"posts"} 
      DELETE /posts/:id(.:format)      {:action=>"destroy", :controller=>"posts"} 

Avviso l'azione per il PUT e POST

+0

Capisco tutto questo ... la mia confusione deriva dalla natura sovrapposta dei due. vale a dire. puoi anche utilizzare una richiesta POST per l'aggiornamento. La mia preoccupazione è che se si desidera semplicemente aggiornare un campo, una richiesta PUT sostituirà completamente il record esistente, richiedendo di specificare i valori di tutti i campi che si desidera mantenere uguali, anziché solo quello che si desidera modificare. – kempchee

1

PUT e POST sono HTTP metodi.

Nel route.rb è necessario eseguire il mapping del metodo e dell'azione del controller. Nella tua classe definisci 3 volte lo stesso metodo. Quindi se vuoi mappare queste azioni su un metodo HTTP non puoi.

È possibile modificare il nome di ciascun metodo e modificare l'implementazione nella classe del modello.

4

Rails per impostazione predefinita mira a utilizzare i verbi HTTP nel modo stabilito dalla specifica REST, non si dovrebbe essere preoccupati del motivo per cui i metodi potrebbero consentire di eseguire la stessa azione. Invece dovresti pensare a fornire un'API che è RESTful e che gli utenti capiranno. Questi comportamenti di default possono essere sovrascritti.

REST denota che:

una richiesta utilizzando il metodo POST dovrebbe agire sulla raccolta delle risorse; aggiunta di una nuova risorsa alla raccolta URL di esempio: http://example.com/resources

Una richiesta che utilizza il verbo HTTP PUT dovrebbe agire su una singola risorsa all'interno della raccolta; sostituzione della risorsa interamente sul server URL di esempio: http://example.com/resource/1

Una richiesta che utilizza il verbo PATCH HTTP deve agire su una singola risorsa all'interno della raccolta; aggiornamento di determinati attributi sulla risorsa in cui si trovaURL di esempio: http://example.com/resource/1

Rails 4 ora utilizza il verbo PATCH sul verbo PUT per l'aggiornamento di una risorsa.

2
  • Penso che dovremmo usare PATCH quando aggiorna alcuni attributi del record di
  • PUT significa davvero qualcosa tra contesto di "sostituire" la risorsa o tutti i suoi attributi, ma potrebbe significa anche la creazione di una risorsa (sto basando questa su quello che ricordo leggendo questo libro: REST API Design Rulebook ), Ad esempio quando si sposta (copia) la risorsa AWS S3 si attiva PUT non POST. Quindi sì, è confuso.
  • POST dovrebbe essere utilizzato al momento della presentazione nuova risorsa

C'è molta confusione intorno PATCH pure, io personalmente sono d'accordo come JSON API standard propone di farlo http://jsonapi.org/format/#crud-updating:

PATCH /articles/1 HTTP/1.1 
Content-Type: application/vnd.api+json 
Accept: application/vnd.api+json 

{ 
    "data": { 
    "type": "articles", 
    "id": "1", 
    "attributes": { 
     "title": "To TDD or Not" 
    } 
    } 
} 

amo Rails I, ma la verità è che non sta seguendo completamente alcune convenzioni Web di base. Rails sta cercando di essere produttivo e le convenzioni troppo rigide stanno frenando la produttività. Quindi non esagerare quando cerchi una risposta per questo. La verità è che Rails sta trattando PUT e PATCH allo stesso modo, e apparentemente entrambi hanno torto. Quindi vi consiglio:

Ma se l'intero progetto utilizza PUT ovunque, non è necessario passare attraverso e cambiare tutto. Basta attenersi a uno o l'altro (PUT o PATCH).

UPDATE

ho scritto 2 articoli su questo argomento dove vado in profondità di questo argomento.

+0

una buona risposta dettagliata, ma nonostante il suo nome lo standard API JSON non è proprio * lo * standard in questo momento, anche se alcuni dei backer sono associati a Rails. Una domanda che tenta di esaminare le opzioni correnti: http://stackoverflow.com/questions/12806386/standard-json-api-response-format – prusswan

+0

a dire il vero mi piace come la compagnia Stormpath propone l'API JSON RESTfull in questo talk https: //www.youtube.com/watch?v=hdSrT4yjS1g. A mio parere mi piace più dell'API JSON http://jsonapi.org/. Ma convenzione sulla configurazione, vado con l'implementazione di JSONAPI.org. Se comunity acconsente a usare qualcos'altro, ma è meglio avere metà standard rispetto a zero standard :) – equivalent8

+0

link eccellente :) – theDrifter