2010-09-17 8 views
18

Sto costruendo un'app di ricette abbastanza semplice per imparare RoR, e sto tentando di consentire a un utente di salvare una ricetta facendo clic su un link piuttosto che attraverso un modulo, quindi sto collegando la funzione 'create' dei controller user_recipe attraverso un link_to.link_to: action => 'create' vai all'indice piuttosto che 'crea'

Sfortunatamente, per qualche motivo il link_to chiama la funzione indice piuttosto che il comando di creazione.

ho scritto il link_to come

 
<%= "save this recipe", :action => 'create', :recipe_id => @recipe %> 

questo link è sul user_recipes/index.html.erb ed è chiamare la funzione 'creare' dello stesso controller. Non sembra fare la differenza se includo il: controller o meno.

I controller simile a questa

 
def index 
    @recipe = params[:recipe_id] 
    @user_recipes = UserRecipes.all # change to find when more than one user in db 
    respond_to do |format| 
     format.html #index.html.erb 
     format.xml { render :xml => @recipes } 
    end 
end 

def create 
    @user_recipe = UserRecipe.new 
    @user_recipe.recipe_id = params[:recipe_id] 
    @user_recipe.user_id = current_user 
    respond_to do |format| 
     if @menu_recipe.save 
     format.html { redirect_to(r, :notice => 'Menu was successfully created.') } 
     format.xml { render :xml => @menu, :status => :created, :location => @menu } 
     else 
     format.html { render :action => "new" } 
     format.xml { render :xml => @menu.errors, :status => :unprocessable_entity } 
     end 
    end 

risposta

37

Nello schema REST standard azione index e l'azione creare entrambi hanno lo stesso URL (/recipes) e solo differiscono in tale indice è possibile accedere tramite GET e creare si accede usando il POST. Quindi, link_to :action => :create genererà semplicemente un collegamento a /recipes che farà sì che il browser esegua una richiesta GET per /recipes quando viene fatto clic e quindi invochi l'azione di indice.

Per richiamare l'azione di creazione utilizzare link_to {:action => :create}, :method => :post, indicando link_to in modo esplicito che si desidera una richiesta di post o utilizzare un modulo con un pulsante di invio anziché un collegamento.

+1

Grazie a Sepp2k, non solo per fornire la risposta, ma spiegando il perché così chiaramente. È una cosa che faccio davvero fatica a capire perché i binari fanno o si aspettano determinati bit, e spesso le risposte online danno solo il "questo è come è fatto" senza il perché. La tua risposta è stata perfetta! – pedalpete

+0

'link_to {: action =>: create},: method =>: post' crea un collegamento con l'attributo' data-method = "POST" '. Che viene utilizzato dal rails javascript per creare un modulo discreto e pubblicarlo. I collegamenti stessi non possono essere utilizzati per inviare qualcosa di diverso dalle richieste GET, che è ciò che accade quando il JS fallisce. – max

9

Supponendo di avere risorse predefinite impostati nel file rotte, vale a dire una cosa del genere

resources :recipes 

Di seguito genererà un link che consente di creare una ricetta; Ad esempio, verrà indirizzato all'azione di creazione.

<%= link_to "Create Recipe", recipes_path, :method => :post %> 

Per far funzionare tutto questo, JS deve essere abilitato nel tuo browser.

Quanto segue genererà un collegamento che mostrerà tutte le ricette; Ad esempio, verrà indirizzato all'azione indice.

<%= link_to "All Recipes", recipes_path %> 

Questo presuppone il valore predefinito che è una richiesta Get HTTP.

Problemi correlati