Javascript 如何使用回形针、angular js、ng文件上传在rails中制作可选附件

Javascript 如何使用回形针、angular js、ng文件上传在rails中制作可选附件,javascript,ruby-on-rails,angularjs,Javascript,Ruby On Rails,Angularjs,我有一个“付款”表格,上面有一个文件附件,用于上传收据,我使用的是回形针、angular.js和ng文件上传插件 如果附件填好了,一切正常 但我想将此附件作为可选附件, 在这个问题上,我尝试了很多方法 , 但是没有人在我的表单上工作,总是会显示错误 No handler found for null Completed 422 Unprocessable Entity in 119ms (Views: 15.4ms | ActiveRecord: 41.7ms) 我想问的是 在ng文件上传插

我有一个“付款”表格,上面有一个文件附件,用于上传收据,我使用的是回形针、angular.js和ng文件上传插件

如果附件填好了,一切正常

但我想将此附件作为可选附件, 在这个问题上,我尝试了很多方法

,

但是没有人在我的表单上工作,总是会显示错误

No handler found for null

Completed 422 Unprocessable Entity in 119ms (Views: 15.4ms | ActiveRecord: 41.7ms)
我想问的是

在ng文件上传插件中是否有任何方法可以制作一个附件,这样如果empety的话就不起作用了

有办法解决吗

这是我的回执图像回形针:

has_attached_file :receipt_img, dependent: :destroy
validates_attachment :receipt_img, :content_type => { :content_type => /\Aimage\/.*\Z/ }, :size => { :in => 0..2.megabytes }
这是我的报酬。咖啡:

Sprangular.service "Payment", ($http, $q, _, Env, Account, Cart, Flash, Upload) ->



service =
    confirmPaymentBankTransfer: (order, payment, bankTransfer) ->

  url = Spree.mountedAt() + "/api/orders/#{order.number}/payments/#{payment.id}"

  bankTransfer.receipt_img.upload = Upload.upload
    url: url
    method: 'PUT'
    headers:
      'X-Spree-Order-Token': order.token
    data:
      payment:
        receipt_img: bankTransfer.receipt_img
        bank_name: bankTransfer.bank_name
        deposited_on: bankTransfer.deposited_on
        account_name: bankTransfer.account_name
        account_no: bankTransfer.account_no
        transaction_reference_no: bankTransfer.transaction_reference_no
        our_bank_name: bankTransfer.our_bank_name

  # $http.put(url, $.param(params), config)
  #   .success (response) ->
  #     Flash.success 'app.account_updated'
  #   .error (response) ->
  #     Flash.error 'app.account_update_failed'
service
谢谢

编辑添加控制器。咖啡

'use strict'

class Sprangular.BankTransfer
  Validity.define @,
    deposited_on: 'required'
    bank_name: 'required'
    account_no: 'required'
    transaction_reference_no: 'required'
    our_bank_name: 'required'

  constructor: (deposited_on=null, bank_name=null, account_name=null, account_no=null, transaction_reference_no=null, our_bank_name=null, receipt_img=null) ->
    @deposited_on = deposited_on
    @bank_name = bank_name
    @account_name = account_name
    @account_no = account_no
    @transaction_reference_no = transaction_reference_no
    @our_bank_name = our_bank_name
    @receipt_img = receipt_img

  init: ->
    @id = @id
    @deposited_on = @deposited_on
    @bank_name = @bank_name
    @account_name = @account_name
    @account_no = @account_no
    @transaction_reference_no = @transaction_reference_no
    @our_bank_name = @our_bank_name
    @receipt_img = @receipt_img

  same: (other) ->
    @id == other.id

验证\u附件
要求附件存在并符合您声明的所有规范。如果希望附件是可选的,请使用
allow\u nil

validates_attachment :receipt_img,
  :content_type => { :content_type => /\Aimage\/.*\Z/ },
  :size => { :in => 0..2.megabytes },
  :allow_nil => true
哦,阿兰杜利亚,上帝, 一天的头痛之后我自己解决了

在尝试了许多参考方法之后,却没有人能成功, 我通过在我的服务(payment.coffee)中创建一个条件来解决这个问题,因此服务看起来如下:

Sprangular.service "Payment", ($http, $q, _, Env, Account, Cart, Flash, Upload) ->

  service =

confirmPaymentBankTransfer: (order, payment, bankTransfer) ->
  if bankTransfer.receipt_img is null
    params =
      payment:
        bank_name: bankTransfer.bank_name
        deposited_on: bankTransfer.deposited_on
        account_name: bankTransfer.account_name
        account_no: bankTransfer.account_no
        transaction_reference_no: bankTransfer.transaction_reference_no

    config =
      ignoreLoadingIndicator: true
      headers:
        'X-Spree-Order-Token': order.token

    url = Spree.mountedAt() + "/api/orders/#{order.number}/payments/#{payment.id}"

    $http.put(url, $.param(params), config)
      .success (response) ->
        Flash.success 'app.account_updated'
      .error (response) ->
        Flash.error 'app.account_update_failed'

  else
    url = Spree.mountedAt() + "/api/orders/#{order.number}/payments/#{payment.id}"

    bankTransfer.receipt_img.upload = Upload.upload
      url: url
      method: 'PUT'
      headers:
        'X-Spree-Order-Token': order.token
      data:
        payment:
          receipt_img: bankTransfer.receipt_img
          bank_name: bankTransfer.bank_name
          deposited_on: bankTransfer.deposited_on
          account_name: bankTransfer.account_name
          account_no: bankTransfer.account_no
          transaction_reference_no: bankTransfer.transaction_reference_no
          our_bank_name: bankTransfer.our_bank_name  

    # $http.put(url, $.param(params), config)
    #   .success (response) ->
    #     Flash.success 'app.account_updated'
    #   .error (response) ->
    #     Flash.error 'app.account_update_failed'

  service
所以我把if-else条件放在函数上,。 看起来有点脏,但对我来说没问题


谢谢你的帮助

我应该在哪里申报?是这样吗?验证附件:receipt\u img,:content\u type=>{:content\u type=>/\Aimage\/.\Z/},:size=>{:in=>0..2.MB},allow\u nil:trueYep,这是spotno,它仍然不起作用,错误显示为“在119ms(视图:15.4ms | ActiveRecord:41.7ms)内未找到null已完成的422个不可处理实体的处理程序”,我编辑了这个问题,我加了控制器,也许能帮上更多的忙,。