#ruby-on-rails #ruby
Вопрос:
Привет, в настоящее время я работаю над приложением веб-маркетплейса для задания, которое позволяет пользователям загружать товары для продажи с прикрепленными изображениями и редактировать эти списки.
В настоящее время я использовал простые формы для редактирования и добавления страниц продуктов, и они работают нормально, но когда я нажимаю обновить или добавить продукт, я получаю следующую ошибку:
ActiveSupport::MessageVerifier::InvalidSignature in ProductsController#create
ошибка указывала на то, что проблема заключается в строке 3 приведенного ниже кода:
def create
@product = Product.new(product_params)
@product.user_id = current_user.id
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, status: :unprocessable_entity }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
Мой файл product.rb выглядит так:
belongs_to :user, :optional => true
has_one_attached :picture
end
Простые формы работают, но для справки html-форма выглядит так:
<%= simple_form_for@product do |f| %>
<h1 class="heading">Edit Product</h1>
<%= render 'form', product: @product %>
<% end %>
Буду признателен за любую помощь, которую я смогу получить.
Ответ №1:
При использовании respond_to do |format|
метода необходимо указать фактические форматы, на которые должен реагировать код. Итак, ваш контроллер, вероятно, должен выглядеть примерно так:
def create
@product = Product.new(product_params)
@product.user_id = current_user.id
respond_to do |format|
format.html do
if @product.save
...
end
end
end
Но я бы также спросил: почему вы используете respond_to
здесь, если вы ожидаете только обработки результата веб-формы? Это то, что вам, возможно, потребуется сделать в какой-то момент, но изначально это не требуется и усложняет задачу.
Если это не решит проблему, нам, вероятно, потребуется просмотреть вашу функцию strong-params ( product_params
), определение модели продукта и, по крайней мере, ваше представление. Например, вам, возможно, потребуется структурировать строку более подобным образом, потому что ваши параметры могут не точно соответствовать полям в вашей модели.
@product = Product.new(id: product_params[:id], name: product_params[:name])
Rails добавляет специальный код аутентификации при создании формы, чтобы предотвратить рассылку спама или взлом вашей формы злоумышленниками. Если ваша страница будет изменена после создания кода, она устареет и будет отклонена, но я ожидал бы более конкретной ошибки, если бы это произошло. Скрестив пальцы!