0

У меня есть форма для создания продуктов в моих рельсах приложении:Rails 5: Удаленная форма неудачи

= form_for product, url: url, method: :post, html: { class: 'product-form' }, remote: true do |f| 

    .row 
    .col-xs-12.col-sm-6 
     .form-group.required 
     = f.label :name 
     = f.text_field :name, autofocus: true, class: 'form-control' 
    .col-xs-12.col-sm-6 
     .form-group.required 
     = f.label :price 
     .input-group 
      .input-group-addon $ 
      = f.number_field :price, class: 'form-control' 

    .row 
    .col-xs-12 
     .form-group 
     = f.label :description 
     = f.text_area :description, class: 'form-control' 

    .row 
    .col-xs-12 
     .form-group 
     = label_tag :images, 'Images' 
     = f.file_field :images, multiple: true, class: 'form-control' 

    .row 
    .col-xs-12.text-right 
     = f.submit "Cancel", class: 'btn btn-default', data: { dismiss: "modal" } 
     = f.submit "Save", class: 'btn btn-primary' 

Он отлично работает на моей среде разработки. Но при работе на Heroku (производство), он терпит неудачу при нажатии на «Save» (отметить, что я использую Завещания и вход/регистрация работает отлично), с этой ошибкой:

2016-10-14T11:55:02.825234+00:00 app[web.1]: W, [2016-10-14T11:55:02.825168 #3] WARN -- Can't verify CSRF token authenticity.

2016-10-14T11:55:02.825602+00:00 app[web.1]: I, [2016-10-14T11:55:02.825555 #3] INFO -- : Completed 422 Unprocessable Entity in 1ms (ActiveRecord: 0.0ms)

2016-10-14T11:55:02.826511+00:00 app[web.1]: F, [2016-10-14T11:55:02.826471 #3] FATAL -- : ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):

Дело в том, когда я не выбираю изображение, он отлично работает. Так что я думаю, что проблема может быть с изображением пользователя:

модели/product.rb

class Product 
    mount_uploaders :images, ProductImageUploader 
    # more stuff... 
end 

закачивающие/product_image_uploader.rb

class ProductImageUploader < CarrierWave::Uploader::Base 
    def store_dir 
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}" 
    end 
end 

Инициализаторы/carrier_wave. rb

if Rails.env.development? || Rails.env.test? 
    CarrierWave.configure do |config| 
    config.storage = :file 
    config.enable_processing = false if Rails.env.test? 
    end 
else 
    CarrierWave.configure do |config| 
    config.fog_provider = 'fog/aws'      # required 
    config.fog_credentials = { 
     provider:    'AWS', 
     aws_access_key_id:  ENV["AWS_KEY_ID"], 
     aws_secret_access_key: ENV["AWS_KEY_SECRET"], 
     region:    'us-west-2',     # optional, defaults to 'us-east-1' 
    } 

    config.fog_directory = ENV['AWS_BUCKET'] 
    config.fog_public = true 

    config.cache_dir = "#{Rails.root}/tmp/uploads" 
    end 
end 

Другое дело, что я попытался создать простой файл:: на производстве, избегая загрузки S3, и он тоже не работает.

Любая идея?

ОБНОВЛЕНИЕ!

Я добавил authenticity_token: true в форме, и это не вызывает исключения, о которых я говорил выше. Тем не менее, что-то странное:

  • Когда я не выбрать изображение из формы, то POST выполняется удаленный:

Processing by ProductsController#create as JS

  • Когда я выбираю изображение в виде , то POST не выполняется удаленный:

Processing by ProductsController#create as HTML

UPDATE 2!

Это сгенерированный HTML для тега формы:

<form class="product-form" id="new_product" enctype="multipart/form-data" action="/seller/products" accept-charset="UTF-8" data-remote="true" method="post"> 
    <input name="utf8" type="hidden" value="✓"> 
    <input type="hidden" name="authenticity_token" value="SOME STUFF">  </form> 

ответ

1

В форме декларации, после того, как remote: true добавить этот authenticity_token: true как:

form_for product, url: url, method: :post, html: { class: 'product-form' }, remote: true, authenticity_token: true do |f| 
+0

Я попробовал это, и это сработало! Но это заставляет форму не делать удаленный POST. –

+0

Фактически, request.format в контроллере возвращает этот текст/html. Прежде чем добавлять аутентификацию_token, это был js, как я и ожидал. –

+0

Рельсы деградируют удалённую форму в обратную сторону HTML, когда JS отключен или выключен. Можете ли вы подтвердить, что js работает на вашей странице? – Sajan