carierwave在上传的文件路径上获取null

时间:2017-06-02 12:53:36

标签: ruby-on-rails ruby ruby-on-rails-5 carrierwave

我使用carierwave发布多部分/表格数据。 这是我的剧本

#imagepath model 
   class Imagepath < ActiveRecord::Base
      belongs_to :imagepost
      attr_accessor :path
      mount_uploader :path, ImagepathUploader
    end

#imagepost model
class Imagepost < ActiveRecord::Base
  belongs_to :user
  has_many :imagepaths
  has_many :imagecomments
  has_many :imagelikes
  attr_accessor :imagepath_data
  # attr_accessor :path
end

    #imagepost controller post method
    # POST /imageposts
  def create
    @imagepost = Imagepost.new(imagepost_params)

    if @imagepost.save
      params[:imagepost][:imagepath_data].each do |file|
        @imagepost.imagepaths.create!(:path => file)
      end

      render json: @imagepost, status: :created, location: @imagepost
    else
      render json: @imagepost.errors, status: :unprocessable_entity
    end
  end


#imagepost_params for post_params
def imagepost_params
    params.require(:imagepost).permit(:title, :description, :user_id, :imagepath_data => [])
end

我使用curl发布数据

curl 
-F "imagepost[imagepath_data][]=c4ewt.JPG" 
-F "imagepost[imagepath_data][]=border-image.png" 
-F "imagepost[title]=asasassasa" 
-F "imagepost[description]=uhuhuhuhuhuhuh" 
-F "imagepost[user_id]=5" localhost:3000/imageposts

发布是工作,但在发布后,我得到的路径行我的imagepath表是null :( enter image description here

1 个答案:

答案 0 :(得分:1)

可能你丢失了@

-F "imagepost[imagepath_data][]=@c4ewt.JPG"

编辑:最好从Rails控制台bin/rails c开始并检查您的数据库:Imagepath.find(17)。它向您显示实际保存的内容。

我建议使用Active Record Nested Attributes和curl -v选项来进行详细输出。 以下是真实项目的简化示例:

<强> report.rb

class Report < ApplicationRecord
  # ...
  accepts_nested_attributes_for :report_images,
    reject_if: proc { |attributes| attributes[ 'image' ].blank? }
end

<强> report_image.rb

class ReportImage < ApplicationRecord
  # ...
  mount_uploader :image, ReportImageUploader
end

<强> reports_controller.rb

class ReportsController < YourBaseController
  # ...
  def create
    # In real project service class is used
    report = Report.create!(create_params)
    # ...
  end

  private

  def create_params
    params
      .require(:report)
      .permit( 
        :my_report_attribute,
        report_images_attributes: [ :kind, :image ] )

  end
end

然后卷曲:

curl -XPOST -v http://lvh.me:3000/yourendpoint/reports \
  -F "report[my_report_attribute]=Hehe" \
  -F "report[report_images_attributes][0][kind]=haha" \
  -F "report[report_images_attributes][0][image]=@/Users/myuser/my0.jpg" \
  -F "report[report_images_attributes][1][kind]=hoho" \
  -F "report[report_images_attributes][1][image]=@/Users/myuser/my1.png"