如何使用回形针,角度JS,ng-file-upload在Rails中制作可选附件

how to make an optional attachment in rails using paperclip, angular js, ng-file-upload

本文关键字:回形针 何使用 角度 JS ng-file-upload Rails      更新时间:2023-09-26

我有一个"付款"表单,其中包含用于上传receipt_img的文件附件,我在前端和ng文件上传插件中使用回形针,角度.js

如果附件已填充,一切正常,

但我想将此附件作为可选附件,在这个堆栈溢出中,我在另一个相同的问题中尝试了很多方法

相同问题 1、相同问题 2

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

No handler found for null
Completed 422 Unprocessable Entity in 119ms (Views: 15.4ms | ActiveRecord: 41.7ms)

我想问的是,

ng-file-upload插件中是否有任何方法可以使附件被破坏,因此如果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

谢谢

编辑添加控制器.coffee

'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

validates_attachment要求附件存在并满足您声明的所有规格。如果希望附件是可选的,请使用allow_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 条件。它看起来有点脏,但对我来说很好。

谢谢你的帮助..