Link_to: action => 'create' собирается индексировать, а не создавать '
Я создаю довольно простое приложение для рецептов, чтобы изучить RoR, и я пытаюсь разрешить пользователю сохранять рецепт, щелкнув ссылку, а не через форму, поэтому я подключаю функцию "create" контроллера user_recipe через ссылка к.
К сожалению, по какой-то причине link_to вызывает функцию index, а не 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
Ответы
Ответ 1
В стандартной схеме REST действие индекса и действие create имеют одинаковый url (/recipes
) и отличаются только тем, что этот индекс обращается к GET, и к нему открывается доступ с помощью POST. Таким образом, link_to :action => :create
будет просто генерировать ссылку на /recipes
, которая заставит браузер выполнить запрос GET для /recipes
при нажатии и, таким образом, вызвать действие индекса.
Чтобы вызвать действие create, используйте link_to {:action => :create}, :method => :post
, явно указав link_to
, что вы хотите отправить запрос, или используйте форму с кнопкой отправки, а не ссылкой.
Ответ 2
Предполагая, что у вас есть ресурсы по умолчанию, установленные в вашем файле маршрутов, то есть что-то вроде этого
resources :recipes
Далее будет создана ссылка, которая создаст рецепт; т.е. будет направлено на действие create.
<%= link_to "Create Recipe", recipes_path, :method => :post %>
Для этого необходимо включить JS в вашем браузере.
Далее будет создана ссылка, в которой будут показаны все рецепты; то есть будет направлено на действие индекса.
<%= link_to "All Recipes", recipes_path %>
Предполагается, что по умолчанию используется HTTP-запрос Get.