У меня есть форма, которая используется как моими новыми, так и редактируемыми шаблонами для модели под названием product. В моем контроллере для действий по созданию и обновлению он перенаправляется на @product и затем демонстрирует «шоу» при успешном завершении. Это отлично работает, когда форма объявляется с помощью `form_for @product do | f |, но если вместо переменной экземпляра используется символ, он пытается отправить POST на ту же страницу. И.Е. Если бы я был на странице products/4/edit и я нажал кнопку submit в форме, это дало бы мне ошибку маршрутизации, которая пыталась выполнить POST-продукты/4/edit, которая имеет только маршрут GET в ресурсах.Почему символ form_for: возвращается на ту же страницу?
Теперь, если я поставлю опцию url «url: products_path», она правильно перенаправляет продукты/4, как если бы я использовал form_for @product. Означает ли это, что использование символа с form_for не идет на мои действия с контроллером? Почему пытается POST для себя?
Вот форма
<%= form_for @product do |f| %> <-- Changing this to :product gives routing error
<% if @product.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:</h2>
<ul>
<% @product.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= f.label :title %><br>
<%= f.text_field :title %>
</div>
<div class="field">
<%= f.label :description %><br>
<%= f.text_area :description, rows: 6 %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
и вот мои действия контроллера для обновления и создания:
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
format.json { render :show, status: :ok, location: @product }
else
format.html { render :edit }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
А, я так и думал! Спасибо за разъяснения –