link_to: action => ‘create’ va al índice en lugar de ‘create’

Estoy creando una aplicación de recetas bastante simple para aprender RoR, y estoy tratando de permitir que un usuario guarde una receta haciendo clic en un enlace en lugar de hacerlo a través de un formulario, así que estoy conectando la función “crear” de los controladores user_recipe a través de link_to.

Desafortunadamente, por alguna razón, link_to está llamando a la función de índice en lugar de a crear.

He escrito el link_to como

  'crear',: recipe_id => @recipe%>

este enlace está en user_recipes / index.html.erb y está llamando a la función ‘crear’ del mismo controlador. No parece hacer una diferencia si incluyo el: controlador o no.

Los controladores se ven así

 índice de def
     @recipe = params [: recipe_id]
     @user_recipes = UserRecipes.all # change para encontrar cuando hay más de un usuario en db
     responder_para hacer | formato |
          format.html # index.html.erb
          format.xml {render: xml => @recipes}
     fin
 fin

 def crear
     @user_recipe = UserRecipe.new
     @ user_recipe.recipe_id = params [: recipe_id]
     @ user_recipe.user_id = current_user
     responder_para hacer | formato |
       si @ menu_recipe.save
         format.html {redirect_to (r,: notice => 'El menú se creó correctamente.')}
         format.xml {render: xml => @menu,: status =>: created,: location => @menu}
       más
         format.html {render: action => "new"}
         format.xml {render: xml => @ menu.errors,: status =>: unprocessable_entity}
       fin
     fin

En el esquema REST estándar, la acción de índice y la acción de crear tienen la misma url ( /recipes ) y solo difieren en el acceso al índice mediante GET y al acceso a la creación mediante POST. Así que link_to :action => :create simplemente generará un enlace a /recipes que hará que el navegador realice una solicitud GET para /recipes cuando se haga clic y, por lo tanto, invoque la acción de índice.

Para invocar la acción de creación, use link_to {:action => :create}, :method => :post link_to link_to {:action => :create}, :method => :post , indicando a link_to explícitamente que desea una solicitud de publicación, o use un formulario con un botón de envío en lugar de un enlace.

Suponiendo que tiene recursos predeterminados configurados en su archivo de rutas, es decir, algo como esto

 resources :recipes 

Lo siguiente generará un enlace que creará una receta; Es decir, se dirigirá a la acción de crear.

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

Para que esto funcione, JS debe estar habilitado en su navegador.

Lo siguiente generará un enlace que mostrará todas las recetas; Es decir, se dirigirá a la acción de índice.

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

Esto supone el valor predeterminado, que es una solicitud Obtener HTTP.