link_to: action => 'create' собирается индексировать, а не 'create' - PullRequest
18 голосов
/ 17 сентября 2010

Я создаю довольно простое приложение с рецептами для изучения RoR, и я пытаюсь позволить пользователю сохранить рецепт, щелкнув ссылку, а не через форму, поэтому я подключаю функцию «создания» контроллеров user_recipe черезссылка на.

К сожалению, по какой-то причине link_to вызывает функцию индекса, а не create.

Я написал link_to как

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

эта ссылка находится наuser_recipes / index.html.erb и вызывает функцию 'create' того же контроллера.Кажется, не имеет значения, если я включу: контроллер или нет.

Контроллеры выглядят так

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

Ответы [ 2 ]

39 голосов
/ 18 сентября 2010

В стандартной схеме REST действие index и действие create оба имеют одинаковые URL (/recipes) и отличаются только тем, что к индексу обращаются с помощью GET, а к create - с помощью POST. Так что link_to :action => :create просто сгенерирует ссылку на /recipes, что заставит браузер выполнить GET-запрос для /recipes при нажатии и, таким образом, вызвать действие index.

Чтобы вызвать действие создания, используйте link_to {:action => :create}, :method => :post, явно сообщая link_to, что вы хотите отправить запрос, или используйте форму с кнопкой отправки вместо ссылки.

11 голосов
/ 05 марта 2012

Предполагается, что в вашем файле маршрутов настроены ресурсы по умолчанию, т.е. что-то вроде этого

resources :recipes

Следующее создаст ссылку, которая создаст рецепт; т.е. будет перенаправлен на действие создания.

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

Чтобы это работало, JS должен быть включен в вашем браузере.

Ниже будет сгенерирована ссылка, которая покажет все рецепты; т.е. будет перенаправлен на действие index.

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

Предполагается, что по умолчанию используется запрос Get HTTP.

...