2011-08-28 18 views
8

Sto provando a creare una funzionalità 'tag' che consente a un utente di "taggare" gli elementi a cui sono interessati. Qui è il mio modelloRails 3 - Come si crea un nuovo record da link_to

class tag 
    belongs_to :user 
    belongs_to :item 
end 

La tabella di DB corrispondente ha le necessarie :user_id e :item_id campi.

Nell'elenco di :items Desidero un collegamento accanto a ogni :item che consente all'utente di contrassegnare lo :item. Poiché conosco lo :user_id e lo :item_id, desidero creare un nuovo record :tag, impostare i campi ID e salvare il record, il tutto senza alcun intervento da parte dell'utente. Ho provato la seguente chiamata a link_to, ma nessun record viene salvato nel database:

<%= link_to 'Tag it!', {:controller => "tracks", 
         :method => :post, 
         :action => "create"}, 
         :user_id => current_user.id, 
         :item_id => item.id %> 

(Questo codice è all'interno di un:. @item.each do |item| dichiarazione, in modo item.id è valido)

Questo crea di link_to questo URL:

http://localhost:3000/tags?method=post&tag_id=7&user_id=1 

che non crea un record Tag nel database. Qui è la mia :create azione nel tags_controller

def create 
    @tag = Tag.new 
    @tag.user_id = params[:user_id] 
    @tag.tag_id = params[:tag_id] 
    @tag.save 
    end 

Come posso ottenere link_to per creare e salvare un nuovo record tag?

risposta

14

Il fatto stesso che l'URL generato abbia un metodo come parametro implica che sta eseguendo un GET e non un POST.

La firma link_to è necessario utilizzare è link_to(body, url_options = {}, html_options = {})

<%= link_to 'Tag it!', {:controller => "item", 
         :action => "create", 
         :user_id => current_user.id, 
         :item_id => item.id}, 
         :method => "post" %> 

: metodo deve essere passato al html_options e riposo a url_options. Questo dovrebbe funzionare.

+0

Grazie! Funziona benissimo con la tua correzione. Mostrare il link alla firma nella tua risposta mi ha davvero aiutato a capire finalmente cosa stava succedendo. Molto apprezzato. –

+1

Solo un rapido commento. Nell'hash url_options il valore della chiave del controller dovrebbe essere "items" e non "item". Ti darebbe un errore di routing ActionController quando provi a visualizzare il link. – icantbecool

+0

@dexter, cosa succede se il collegamento è esterno all'app, ad esempio in un'email, ad esempio? Il mio caso d'uso è per RSVP. Voglio creare un nuovo RSVP direttamente dal link di posta elettronica, ma voglio rimanere RESTful. – Mohamad

Problemi correlati