【问题标题】:Angular.js multiple file attachments upload with RailsAngular.js 使用 Rails 上传多个文件附件
【发布时间】:2015-09-13 14:55:44
【问题描述】:

我正在尝试使用 Angular 从一个表单上传多个文件。问题是,rails 应用程序只接收params 哈希中的一个文件。

我有一个创建article 的表单,而article 有多个article_attachments

在 angular article.js 服务文件中,我正在上传这样的表单:

function(Upload, $http, $q) { 
  var article = {
    create: function(newArticleForm) {
      sendPayload(newArticleForm, 'POST', '/articles.json');
    }
  }

  sendPayload = function(formData, method, url) {
    var file_attachment, options, ref, ref1;
    file = (ref = formData.file) != null ? ref : [];
    var names = [];
    for (var i = 0; i < formData.file.length; ++i) 
      names.push(formData.file[i].name);
    options = {
      url: url,
      method: method,
      file: formData.file,
      file_form_data_name: names,
      fields: {
        article: {
          brand: formData.brand,
          price: formData.price,
          user_id: formData.user_id
        }
      }
    };
    return Upload.upload(options);
  };
  return article;
}

console.log 确实给出了它正在发送多个文件,如下所示:

但问题出在 Rails 方面,在我的 articles_controller.rb 文件中,params 哈希仅包含其中一个文件

def create
  @article = current_user.articles.new(article_params)
  begin
    @article.save!
    if params[:article][:file]
      params[:article][:file].each { |image| @article.article_attachments.create(url: image)}
    end
    render json: @article.to_json 
  rescue ActiveRecord::RecordInvalid => e
    render json: @article.errors ## You might want to specify a json format as well    
    return 
  end
end

private

def article_params
  params.require(:article).permit(
    :price, :brand, :model,:provider,
    :internal_memory, :color,
    :article_state, :battery_included, :user_id,
    :file
  )
end

def process_params
  params[:article] = JSON.parse(params[:article])
                             .with_indifferent_access

end

请求参数,应该包含 2 个上传文件:

{
   "article" => {
      "brand" => "LG",
      "price" => 123,
    "user_id" => 2
},
      "file" => #<ActionDispatch::Http::UploadedFile:0x007fe458d5b760 @tempfile=#<Tempfile:/var/folders/ps/tt94sbxd3dz31rxvw3v1r8nw0000gn/T/RackMultipart20150913-2113-hwty51.jpg>, @original_filename="140911111141-photo-realism-sam-silva-ocelot-horizontal-large-gallery.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name=\"file\"; filename=\"140911111141-photo-realism-sam-silva-ocelot-horizontal-large-gallery.jpg\"\r\nContent-Type: image/jpeg\r\n">,
"controller" => "articles",
    "action" => "create",
    "format" => "json"
}

那么这里缺少什么?

【问题讨论】:

  • 请求参数哈希是什么?
  • 顺便说一句,has_one:文件?还是 has_many 文件?
  • has_many files 关系,我更新了一个请求参数的示例
  • 你正在发送一个文件
  • rails 预期文件[] -

标签: ruby-on-rails angularjs restangular


【解决方案1】:

尝试将您的article_params 更改为下方

def article_params
  params.require(:article).permit( :price, :brand, :model,:provider, :internal_memory, :color, :article_state, :battery_included, :user_id, :file => [])
end

【讨论】:

  • 它不起作用,它只接收一个文件作为上传
  • field: [] 对于强参数数组是正确的
  • 但对我来说,它看起来不像您发送 article[files][] 。您只需发送文件[]。对吗?
  • 是的,我正在使用restangular并关注这篇博文bradleymosesjohnson.com/2015/06/11/file-attachments-in-angular
猜你喜欢
  • 1970-01-01
  • 2012-03-10
  • 1970-01-01
  • 1970-01-01
  • 2017-10-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多