Разница между маршрутами new
и create
является распространенным источником путаницы для начинающих, и все из-за бессилия и того, как REST использует методы HTTP, чтобы правильно различать guish между различными действиями.
# Given
rails g scaffold article title:string body:text
Это дает нам маршрут GET /articles/new
, который просто отображает форму. Это идемпотентный маршрут, поскольку он покажет одинаковые результаты любому посетителю. Когда мы на самом деле публикуем форму, она отправляется как POST /articles
, что является неидемпотентным действием, поскольку оно создает ресурс.
class ArticlesController < ApplicationController
before_action :set_article, only: [:show, :edit, :update, :destroy]
# ...
# POST /articles
def create
@article = Article.new(article_params)
if @article.save
redirect_to @article, notice: 'Article was successfully created.'
else
render :new
end
end
# ...
private
# Use callbacks to share common setup or constraints between actions.
def set_article
@article = Article.find(params[:id])
end
# Only allow a trusted parameter "white list" through.
def article_params
params.require(:article).permit(:title, :body)
end
end
То, что вы и все остальные зациклились, это render :new
. Эта строка не перенаправляет. Он просто отображает /app/views/articles/new.html.erb
и отправляет его в ответе. Путь в браузере - /articles
, поскольку именно туда отправляется форма. То, что вы видите, является результатом выполнения неидемпотентного действия.
Если вы хотите проверить, находитесь ли вы в новом или создать действие определенного c контроллера, вы хотите использовать вместо этого имя_ контроллера и имя_ действия:
<% if controller_name == "checkouts" && ["new", "create"].include?(action_name) %>
# ...
<% end %>