Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

link_to :action => 'create' going to index rather than 'create'

I am building a fairly simple recipe app to learn RoR, and I am attempting to allow a user to save a recipe by clicking a link rather than through a form, so I am connecting the user_recipe controllers 'create' function through a link_to.

Unfortunately, for some reason the link_to is calling the index function rather than the create.

I've written the link_to as

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

this link is on the user_recipes/index.html.erb and is calling the 'create' function of the same controller. It doesn't seem to make a difference if I include the :controller or not.

The controllers look like this

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
like image 648
pedalpete Avatar asked Sep 17 '10 19:09

pedalpete


People also ask

How do I create a link in Rails?

Rails link_to Options & ArgumentsThe first argument for link_to is the text on the link. The second argument? It's the URL you're linking to. You can hardcode it if you want, but most of the time you'll be using a Rails model, or a _path method.

How do I link pages in Rails?

Instead of using the anchor ( <a> ) HTML tags for links, Rails provides the link_to helper to add links. Remember, Ruby code in the views must be enclosed in a <% %> or a <%= %> tag.


2 Answers

In the standard REST scheme the index action and the create action both have the same url (/recipes) and only differ in that index is accessed using GET and create is accessed using POST. So link_to :action => :create will simply generate a link to /recipes which will cause the browser to perform a GET request for /recipes when clicked and thus invoke the index action.

To invoke the create action use link_to {:action => :create}, :method => :post, telling link_to explicitly that you want a post request, or use a form with a submit button rather than a link.

like image 107
sepp2k Avatar answered Sep 28 '22 16:09

sepp2k


Assuming you have default resources set up in your routes file, i.e. something like this

resources :recipes

The following will generate a link that will create a recipe; i.e. will be routed to the create action.

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

For this to work, JS needs to be enabled in your browser.

The following will generate a link that will show all recipes; i.e. will be routed to the index action.

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

This assumes the default which is a Get HTTP request.

like image 31
Yusuf Saber Avatar answered Sep 28 '22 16:09

Yusuf Saber