ruby-on-rails - Ruby on Rails 4 和 Paperclip

标签 ruby-on-rails ruby image ruby-on-rails-4 paperclip

我正在用 Rails 构建一个项目,它是一家公司的虚拟商店。用户应该能够注册新产品和上传图片,所以我生成了 2 个模型:“Product”和“Image”,Product has_many Images 和 Image belongs_to product,我已经运行回形针来更新图像。 “accepts_nested_attributes_for :images”在产品模型中,因此我可以保存来自同一产品表单的图像。问题是图像没有被保存。用户应该能够上传 3 张图片(这就是我允许它“3.times {@product.images.build}”的方式)。这是我的产品 Controller :

def new
    @product = Product.new
    3.times {@product.images.build}
 end

 def create
     @product = Product.new(params[:product])
     if @product.save
        redirect_to :root
     else
        render :action => 'new'
     end
 end

我也试过像这样定义 product_params 方法:

private
    def product_params
        params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [])
    end

控制台抛出的Request信息是这样的:

Request

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"qRyYjG9pSaFxgCtMddDN3fpbsTeIAagLEz+psd+Z+oHa2AVjXpXYcbxta/Egj2TGrmF3FFNCllkY54dig3aN8g==",
 "product"=>{"title"=>"Title",
 "info"=>"Infor",
 "description"=>"Description",
 "price"=>"9",
 "images_attributes"=>{"0"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d830 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-h6wdta.png>,
 @original_filename="sticker,
375x360.u1.png",
 @content_type="image/png",
 @headers="Content-Disposition: form-data; name=\"product[images_attributes][0][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">},
 "1"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d704 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-19t1r3v.png>,
 @original_filename="sticker,
375x360.u1.png",
 @content_type="image/png",
 @headers="Content-Disposition: form-data; name=\"product[images_attributes][1][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">},
 "2"=>{"photo"=>#<ActionDispatch::Http::UploadedFile:0xad3d650 @tempfile=#<Tempfile:/tmp/RackMultipart20150820-9643-fj3w5g.png>,
 @original_filename="sticker,
375x360.u1.png",
 @content_type="image/png",
 @headers="Content-Disposition: form-data; name=\"product[images_attributes][2][photo]\"; filename=\"sticker,
375x360.u1.png\"\r\nContent-Type: image/png\r\n">}}},
 "commit"=>"Submit"}

如果我在 @product = Product.new(product_params) 中将方法 product_params 作为参数传递,它会保存标题、描述和价格,但不会保存图像。

最佳答案

你保留了 :images_attributes => [] 但它应该是 :images_attributes => [:image]

所以,改变这个:

params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [])

到:

params.require(:product).permit(:title, :info, :description, :price, :images_attributes => [:image])

在您的 product_params 方法中。

之后它应该可以工作了!

对于图像验证,使用这个:

validates_attachment_presence :image

如果此验证不起作用,请尝试使用如下自定义验证:

  validate :image_present

  def image_present
    if image_file_name.blank?
      errors.add(:image, :image not present")
    end
  end

关于ruby-on-rails - Ruby on Rails 4 和 Paperclip,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32124318/

相关文章:

ruby-on-rails - 使用 Resque 重新排队作业

ruby-on-rails - 路由以匹配单数名称而不是 ':resources' 生成的复数

ruby-on-rails - 返回自身的 Ruby 方法

ruby - 哈希到数组转换

ruby-on-rails - Rails 迁移问题 : disk image is malformed?

ruby-on-rails - 具有友好 ID 的 ActiveAdmin

php - 我怎样才能让我的图像在空白处居中?

android - Xamarin Forms 图像不显示

android - 来自画廊/相机 Intent 的图片方向

ruby-on-rails - 如何添加不包含引号值的 Rails 表单助手 HTML 属性?