Je construis une application de recette assez simple pour apprendre RoR, et j'essaye de permettre à un utilisateur de sauvegarder une recette en cliquant sur un lien plutôt que par un formulaire, donc je connecte la fonction 'create' des contrôleurs user_recipe via un link_to.link_to: action => 'create' va indexer plutôt que 'créer'
Malheureusement, pour une raison quelconque, link_to appelle la fonction d'index plutôt que create.
J'ai écrit le link_to comme
<%= "save this recipe", :action => 'create', :recipe_id => @recipe %>
ce lien est sur le user_recipes/index.html.erb et appelle la fonction « créer » du même contrôleur. Cela ne semble pas faire de différence si j'inclue le: controller ou non.
Les contrôleurs se présentent comme suit
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
Merci Sepp2k, non seulement pour fournir la réponse, mais en expliquant pourquoi aussi clairement. C'est quelque chose que j'ai vraiment du mal à comprendre pourquoi les rails font ou attendent certains bits, et souvent les réponses en ligne ne donnent que le «c'est comme ça» sans le pourquoi. Votre réponse était parfaite! – pedalpete
'link_to {: action =>: créer},: method =>: post' crée un lien avec l'attribut' data-method = "POST" '. Ce qui est utilisé par les rails javascript pour créer un formulaire discret et le poster. Les liens eux-mêmes ne peuvent pas être utilisés pour envoyer autre chose que des requêtes GET, ce qui se passe lorsque le JS échoue. – max