2010-09-17 6 views
18

Estoy construyendo una aplicación de receta bastante simple para aprender RoR, y estoy tratando de permitir que un usuario guarde una receta haciendo clic en un enlace en lugar de un formulario, así que estoy conectando la función 'create' de los controladores de receta de usuario a través de un link_to.link_to: action => 'create' yendo al índice en lugar de 'crear'

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

He escrito el link_to como

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

este enlace se encuentra en la user_recipes/index.html.erb y está llamando a la función 'crear' del mismo controlador. No parece marcar la diferencia si incluyo el controlador: o no.

Los controladores se ven así

 
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 

Respuesta

37

En el esquema RESTO estándar de la acción index y la acción de crear ambos tienen la misma URL (/recipes) y sólo se diferencian en que el índice se accede a él mediante GET y crear es visitada usando POST. Por lo tanto, link_to :action => :create simplemente generará un enlace a /recipes, que hará que el navegador realice una solicitud GET para /recipes al hacer clic y, por lo tanto, invocar la acción del índice.

Para invocar la acción crear use link_to {:action => :create}, :method => :post, diciendo link_to explícitamente que desea una solicitud posterior, o utilice un formulario con un botón de enviar en lugar de un enlace.

+1

Gracias Sepp2k, no solo por proporcionar la respuesta, sino por explicar el porqué de manera tan clara. Es algo que realmente me cuesta comprender por qué los rieles tienen o esperan ciertos bits, y con frecuencia las respuestas en línea solo dan el 'así es como se hace' sin el por qué. ¡Tu respuesta fue perfecta! – pedalpete

+0

'link_to {: action =>: create},: method =>: post' crea un enlace con el atributo' data-method = "POST" '. El cual es utilizado por los rails javascript para crear un formulario discreto y publicarlo. Los enlaces en sí no pueden utilizarse para enviar nada más que solicitudes GET, que es lo que sucede cuando falla el JS. – max

9

Asumiendo que tiene recursos predeterminados creados en el archivo de rutas, es decir, algo como esto

resources :recipes 

A continuación se va a generar un vínculo que va a crear una receta; es decir, se enrutará a la acción de creación.

<%= 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 enrutará a la acción de índice.

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

Esto asume el valor predeterminado que es una solicitud HTTP.

Cuestiones relacionadas