2016-10-14 20 views
0

我有一个表格在我的Rails应用程序创建产品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(生产)运行时,“保存”,当点击失败(注意,我用的设计和登录/注册工作正常),与此错误:

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

  • 当我在表单中选择一个图像,该职位并非远程完成:

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。正如我所料,在添加authenticity_token之前,它是js。 –

+0

当JS被禁用或关闭时,Rails会将远程表单降级为HTML回退。你能确认js正在你的页面上工作吗? – Sajan