Способ Rails справиться с этим будет в виде отдельного, но вложенного ресурса - поскольку вы действительно создаете новый ресурс (комментарий) и не изменяете сам продукт.
Это также сохраняет ваш код всоответствует принципу единой ответственности (SRP), поскольку каждый контроллер обрабатывает только CRUD'ы с одним типом ресурса.
Вы можете вкладывать ресурсы , вкладывая вызовы в resources
:
resources :products do
resources :comments, shallow: true
end
Затем настройте CommentsController для обработки комментариев CRUD:
class CommentsController < ApplicationController
before_action :set_comment, only: [:index, :new, :create]
# GET /products/:product_id/comments
def index
@comments = @product.comments
end
# GET /products/:product_id/comments/new
def new
@comment = @product.comments.new
end
# POST /products/:product_id/comments
def create
@comment = @product.comments.new(comment_params)
if @comment.save
redirect_to @product, success: 'Comment created'
else
render :new
end
end
# ...
private
def set_product
@product = Product.find(params[:product_id])
end
def comment_params
params.require(:comment)
.permit(:foo, :bar)
end
end
Чтобы установить атрибут действия формы для указания на вложенный маршрут, вы просто используете массив или именованный product_comments(product_id: @product.to_param)
помощник маршрута.
<%= form_with(model: @comment, url: [@comment.product, @comment], local: true) do |form| %>
<%= form.submit 'Add comment' %>
<% end %>
Поскольку идентификатор продукта передается через URI, нет необходимости передавать его через скрытый ввод.
Я думаю, что он как-то связан стот факт, что этот form_with вложен в более крупную форму и выглядит, когда я нажимаю кнопку Добавить комментарий, запускает внешнюю отправку
Следует отметить, что стандарты HTML (как HTML5, так и старше (x)Стандарты HTML) не допускают вложенных элементов формы, и поведение может быть очень непредсказуемым, так как оно не указано, если браузер должен использовать атрибут действия вложенной формы или передать событие родительскому элементу формы, что, скорее всего, происходит в вашем случае.см .: http://w3.org/TR/html5/forms.html