2010-09-17 11 views
18

Buduję dość prostą aplikację na receptę, aby poznać RoR, i staram się zezwolić użytkownikowi na zapisanie receptury przez kliknięcie łącza zamiast przez formularz, więc łączę funkcję 'create' kontrolerów user_recipe poprzez link_to.link_to: action => 'create' przechodząc do indeksu zamiast "tworzyć"

Niestety, z jakiegoś powodu link_to wywołuje funkcję indeksu zamiast tworzenia.

Pisałem o link_to jak

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

Ten link jest na user_recipes/index.html.erb i woła „Utwórz” funkcję tego samego kontrolera. Wydaje się, że nie ma to znaczenia, jeśli dołączę: kontroler lub nie.

Regulatory wyglądać następująco

 
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 

Odpowiedz

37

w standardowym schemacie REST akcji index i działaniem tworzyć oba mają ten sam adres URL (/recipes) i różnią się w tym indeksie są dostępne przy użyciu tylko dostać i tworzenia jest dostępna przy użyciu testu POST. Tak więc link_to :action => :create po prostu wygeneruje link do /recipes, który spowoduje, że przeglądarka wykona żądanie GET dla /recipes po kliknięciu i tym samym wywoła akcję indeksu.

Aby wywołać akcję tworzenia, należy użyć link_to {:action => :create}, :method => :post, wyraźnie mówiąc, że chcesz wysłać prośbę o wpis, lub użyć formularza z przyciskiem przesyłania zamiast linku.

+1

Dziękuję Sepp2k, nie tylko za udzielenie odpowiedzi, ale wyjaśnienie, dlaczego tak wyraźnie. Jest to coś, z czym naprawdę walczę ze zrozumieniem, dlaczego szyny mają lub oczekują pewnych bitów, a często odpowiedzi w Internecie dają tylko "tak to się robi" bez przyczyny. Twoja odpowiedź była doskonała! – pedalpete

+0

'link_to {: action =>: create},: method =>: post' tworzy łącze z atrybutem' data-method = "POST" '. Który jest używany przez javascript szyn, aby utworzyć dyskretną formę i opublikować ją. Odsyłacze nie mogą być używane do wysyłania niczego poza żądaniami GET, co ma miejsce w przypadku niepowodzenia JS. – max

9

Zakładając, że zasoby domyślne skonfigurowane w pliku trasy, to coś takiego

resources :recipes 

Poniższa wygeneruje link, który stworzy przepis; tj. zostanie przekierowany do akcji tworzenia.

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

Aby to działało, należy włączyć obsługę JS w przeglądarce.

Poniższe wygeneruje link, który wyświetli wszystkie przepisy; tj. zostanie przekierowany do akcji indeksowej.

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

Zakłada to wartość domyślną, która jest żądaniem Get HTTP.