Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 图片无法使用回形针保存,rails 4.2_Ruby On Rails_Image_Paperclip - Fatal编程技术网

Ruby on rails 图片无法使用回形针保存,rails 4.2

Ruby on rails 图片无法使用回形针保存,rails 4.2,ruby-on-rails,image,paperclip,Ruby On Rails,Image,Paperclip,我正在尝试允许用户上传图片 我已经阅读了许多相同的问题,并观看了一些教程…我仍然缺少一些东西。我看到图像文件参数在控制台中拾取,但未保存 另一个问题,为什么rails希望该方法是补丁而不是帖子 谢谢你的帮助 这是我的模型照片: class Picture < ActiveRecord::Base has_attached_file :picture, styles: { medium: "300x300", thumb: "100x100#" } validates_a

我正在尝试允许用户上传图片

我已经阅读了许多相同的问题,并观看了一些教程…我仍然缺少一些东西。我看到图像文件参数在控制台中拾取,但未保存

另一个问题,为什么rails希望该方法是补丁而不是帖子

谢谢你的帮助

这是我的模型照片:

class Picture < ActiveRecord::Base

    has_attached_file :picture, styles: { medium: "300x300", thumb: "100x100#" }

    validates_attachment_content_type :picture, :content_type => ["image/jpg", "image/jpeg", "image/png", "image/gif"]

    belongs_to :user
end
这是我的查看页面:

    <%= form_for(@user, :html => {:multipart => true}, :url => { :action => 'upload_image', :user_ud => @user.id }) do |f| %>
        <%= f.file_field "upload[picture]" %>
        <%= f.submit :Upload %>
    <% end %>
从控制台:

已在处为::1启动修补程序/MeetSomeone/upload_image?用户_ud=11 2015-12-24 01:22:38-0800用户处理ControllerUpload\u图像 作为HTML参数:{utf8=>✓, 真实性令牌=>/FHKG2T1VIVLIISE5J5NDRO63PPOELHEWCLFEELEWB1XNUVV8HD5VFTNMSWCGP+7v8W/wqiuQtOd4GGw2oA==, 用户=>{上传=>{图片=>,, @原始文件名=scott.jpeg,@content\u type=image/jpeg, @headers=内容处置:表单数据; name=\user[上传[图片]]\; filename=\scott.jpeg\\r\n内容类型:image/jpeg\r\n>}, 提交=>Upload,用户\ ud=>11}用户加载0.2ms选择 users.*来自users.id=?限制1[[id,11]] 在3ms ActiveRecord中完成了400个错误请求:0.2ms

ActionController::ParameterMissing param缺失或值为 空:上传:app/controllers/users\u controller.rb:52:in pic_params的app/controllers/users_controller.rb:46:in 上传图片'

这样做:

def pic_params
   params.require(:user).permit(upload: [:picture])
end
您当前遇到的问题是,您的参数哈希期望

"upload" => {
   "picture => "..."
}
因为您正在为@user使用表单_,所以它正在将参数散列构建为

"user" => {
  "upload" => {
     "picture" => {
       ....
     }
  }
}
这就是为什么会出现错误:

参数丢失或值为空:上载

你的结构真的很糟糕,我在下面纠正了一些;你最好仔细阅读这本书,看看它是如何工作的

我个人会做以下工作:

#config/routes.rb
resources :pictures #-> url.com/pictures/new

#app/controllers/pictures_controller.rb
class PicturesController < ApplicationController
   before_action :user

   def new
     @picture = @user.pictures.new
   end

   def create
     @picture = @user.pictures.new pic_params
     @picture.save
   end

   private

   def pic_params
      params.require(:picture).permit(:image)
   end

   def user
      @user = User.find params[:session_id]
   end
end

#app/views/pictures/new.html.erb
<%= form_for @picture, multipart: true do |f| %>
   <%= f.file_field :picture %>
   <%= f.submit %>
<% end %>
这将允许您使用:

#app/views/users/upload_image.html.erb
<%= form_for @user do |f| %>
   <%= f.fields_for :picture do |p| %>
      <%= p.file_field :picture %>
   <% end %>
   <%= f.submit %>
<% end %>
这将为您拥有的任何启用回形针的模型设置默认选项,当然可以覆盖这些选项

最终,这意味着您可以非常简单地清理您的模型:

#app/models/picture.rb
class Picture < ActiveRecord::Base
    belongs_to :user

    has_attached_file :picture
    validates :picture, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
end
#app/views/users/upload_image.html.erb
<%= form_for @user do |f| %>
   <%= f.fields_for :picture do |p| %>
      <%= p.file_field :picture %>
   <% end %>
   <%= f.submit %>
<% end %>
#config/application.rb
...
config.paperclip_defaults = {
   styles: { medium: "300x300", thumb: "100x100#" }
}
#app/models/picture.rb
class Picture < ActiveRecord::Base
    belongs_to :user

    has_attached_file :picture
    validates :picture, content_type: { content_type: ["image/jpg", "image/jpeg", "image/png", "image/gif"] }
end