我有一个表格在我的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>
我已经试过了,它的工作!但它会导致表单不执行远程POST。 –
实际上,控制器中的request.format返回这个文本/ html。正如我所料,在添加authenticity_token之前,它是js。 –
当JS被禁用或关闭时,Rails会将远程表单降级为HTML回退。你能确认js正在你的页面上工作吗? – Sajan