为什么回形针不保存上传的图像?
Why doesn't paperclip save uploaded image?
我有一个名为 employers 的模型,我正在使用回形针上传图像。它以前可以工作,但由于某种原因,它已停止工作。我要求用户填写包含姓名、公司和个人资料照片的表格。在我的控制器中,我已将其设置为如果出现问题则不会提交表单。如果表单被提交,用户将被重定向到主页,如果出现问题,表单将再次呈现。现在,表单已提交。在我的开发日志中,图片的名称也在那里。我的开发长是这样的(我在这里更新表格,与新表格的概念相同):
Started PATCH "/employers/werwer" for ::1 at 2017-06-28 21:37:15 -0400
Processing by EmployersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"JeftOiYu26+Vxo/f6NSigrUzHaTsukGvIoGxUVJkH4OGK+HcAs7fH5DWWDHnZiFTYs0/YqN4ZhAYxgwqmSfo7w==", "employer"=>{"name"=>"werwer", "company"=>"werwe", "position"=>"werwer", "number"=>"345345", "email"=>"dinukap999@gmail.com"}, "picture"=>#<ActionDispatch::Http::UploadedFile:0x0000000b570bb0 @tempfile=#<Tempfile:C:/Users/dinuka/AppData/Local/Temp/RackMultipart20170628-7872-a8xds6.png>, @original_filename="icons8-Manager-48.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"picture\"; filename=\"icons8-Manager-48.png\"\r\nContent-Type: image/png\r\n">, "commit"=>"Update Employer", "id"=>"werwer"}
[1m[35mEmployer Load (1.0ms)[0m SELECT "employers".* FROM "employers" WHERE "employers"."slug" = ? ORDER BY "employers"."id" ASC LIMIT 1 [["slug", "werwer"]]
[1m[36m (1.0ms)[0m [1mbegin transaction[0m
[1m[35m (1.0ms)[0m commit transaction
Redirected to http://localhost:3000/employers/werwer
Completed 302 Found in 35ms (ActiveRecord: 3.0ms)
如您所见,名称为"a8xds6.png"的图片显示在第三行。但我不确定为什么将其作为临时文件提交。
当我打开 rails 控制台并查看该特定雇主的数据时,除了图像之外的所有其他内容都会更新。图片显示 "nil".
这是我的表格:
<%= simple_form_for @employer do |f| %>
<%= f.input :name, required: true, label: 'Full name' %>
<%= f.input :company, required: true, label: 'Name of company' %>
<%= f.file_field :emp_img, required: true, name: 'picture' %>
<%= f.button :submit %>
<% end %>
控制器:
class EmployersController < ApplicationController
before_action :find_employer, only: [:show, :edit, :update, :destroy]
def index
end
def show
end
def new
@employer = current_user.build_employer
end
def create
@employer = current_user.build_employer(employer_params)
if @employer.save
redirect_to userinfos_path
else
render 'new'
end
end
def edit
end
def update
if @employer.update(employer_params)
redirect_to employer_path(@employer)
else
render 'edit'
end
end
def destroy
@employer.destroy
redirect_to root_path
end
private
def employer_params
params.require(:employer).permit(:name, :company, :emp_img)
end
def find_employer
@employer = Employer.friendly.find(params[:id])
end
end
雇主模型:
class Employer < ActiveRecord::Base
belongs_to :user
has_attached_file :emp_img, :styles => { :profile_pic => "200x200>" }, :default_url => "/images/:style/missing10.png"
validates_attachment_content_type :emp_img, :content_type => /\Aimage\/.*\Z/
end
查看:
<%= image_tag @employer.emp_img.url(:profile_pic) %>
如果您需要更多信息,请告诉我需要更改的内容。我知道开发日志显示的参数比表单中的多,我删除了一些参数以简化问题。
你的 emp_img file_field 不应该有自定义名称属性,如果你这样做,你应该允许它并添加一个 attr_accessor .
private
def employer_params
params.require(:employer).permit(:name, :company, :emp_img, :picture)
end
雇主模型:
class Employer < ActiveRecord::Base
[...]
attr_accessor :picture
[...]
end
上传到服务器的文件将作为临时文件保存在 tmp 文件夹中,rails 将使用 ActionDispatch 处理它,在您的 rails 对象保存后,临时文件将被移动到文件夹您指定的目录路径然后保存。
您应该删除 file_field 中的名称属性。
在您的表格中,如果您仔细观察。可以看到,可以把名字属性改成图片,图片应该是emploer[emp_img]
。
由于这个 emp_imp
不存在于 employer
参数中,并且不只更新 emp_img
。
尝试改变
<%= f.file_field :emp_img, required: true, name: 'picture' %>
到
<%= f.file_field :emp_img, required: true %>
这将解决您的问题。
我有一个名为 employers 的模型,我正在使用回形针上传图像。它以前可以工作,但由于某种原因,它已停止工作。我要求用户填写包含姓名、公司和个人资料照片的表格。在我的控制器中,我已将其设置为如果出现问题则不会提交表单。如果表单被提交,用户将被重定向到主页,如果出现问题,表单将再次呈现。现在,表单已提交。在我的开发日志中,图片的名称也在那里。我的开发长是这样的(我在这里更新表格,与新表格的概念相同):
Started PATCH "/employers/werwer" for ::1 at 2017-06-28 21:37:15 -0400
Processing by EmployersController#update as HTML
Parameters: {"utf8"=>"✓", "authenticity_token"=>"JeftOiYu26+Vxo/f6NSigrUzHaTsukGvIoGxUVJkH4OGK+HcAs7fH5DWWDHnZiFTYs0/YqN4ZhAYxgwqmSfo7w==", "employer"=>{"name"=>"werwer", "company"=>"werwe", "position"=>"werwer", "number"=>"345345", "email"=>"dinukap999@gmail.com"}, "picture"=>#<ActionDispatch::Http::UploadedFile:0x0000000b570bb0 @tempfile=#<Tempfile:C:/Users/dinuka/AppData/Local/Temp/RackMultipart20170628-7872-a8xds6.png>, @original_filename="icons8-Manager-48.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"picture\"; filename=\"icons8-Manager-48.png\"\r\nContent-Type: image/png\r\n">, "commit"=>"Update Employer", "id"=>"werwer"}
[1m[35mEmployer Load (1.0ms)[0m SELECT "employers".* FROM "employers" WHERE "employers"."slug" = ? ORDER BY "employers"."id" ASC LIMIT 1 [["slug", "werwer"]]
[1m[36m (1.0ms)[0m [1mbegin transaction[0m
[1m[35m (1.0ms)[0m commit transaction
Redirected to http://localhost:3000/employers/werwer
Completed 302 Found in 35ms (ActiveRecord: 3.0ms)
如您所见,名称为"a8xds6.png"的图片显示在第三行。但我不确定为什么将其作为临时文件提交。
当我打开 rails 控制台并查看该特定雇主的数据时,除了图像之外的所有其他内容都会更新。图片显示 "nil".
这是我的表格:
<%= simple_form_for @employer do |f| %>
<%= f.input :name, required: true, label: 'Full name' %>
<%= f.input :company, required: true, label: 'Name of company' %>
<%= f.file_field :emp_img, required: true, name: 'picture' %>
<%= f.button :submit %>
<% end %>
控制器:
class EmployersController < ApplicationController
before_action :find_employer, only: [:show, :edit, :update, :destroy]
def index
end
def show
end
def new
@employer = current_user.build_employer
end
def create
@employer = current_user.build_employer(employer_params)
if @employer.save
redirect_to userinfos_path
else
render 'new'
end
end
def edit
end
def update
if @employer.update(employer_params)
redirect_to employer_path(@employer)
else
render 'edit'
end
end
def destroy
@employer.destroy
redirect_to root_path
end
private
def employer_params
params.require(:employer).permit(:name, :company, :emp_img)
end
def find_employer
@employer = Employer.friendly.find(params[:id])
end
end
雇主模型:
class Employer < ActiveRecord::Base
belongs_to :user
has_attached_file :emp_img, :styles => { :profile_pic => "200x200>" }, :default_url => "/images/:style/missing10.png"
validates_attachment_content_type :emp_img, :content_type => /\Aimage\/.*\Z/
end
查看:
<%= image_tag @employer.emp_img.url(:profile_pic) %>
如果您需要更多信息,请告诉我需要更改的内容。我知道开发日志显示的参数比表单中的多,我删除了一些参数以简化问题。
你的 emp_img file_field 不应该有自定义名称属性,如果你这样做,你应该允许它并添加一个 attr_accessor .
private
def employer_params
params.require(:employer).permit(:name, :company, :emp_img, :picture)
end
雇主模型:
class Employer < ActiveRecord::Base
[...]
attr_accessor :picture
[...]
end
上传到服务器的文件将作为临时文件保存在 tmp 文件夹中,rails 将使用 ActionDispatch 处理它,在您的 rails 对象保存后,临时文件将被移动到文件夹您指定的目录路径然后保存。
您应该删除 file_field 中的名称属性。
在您的表格中,如果您仔细观察。可以看到,可以把名字属性改成图片,图片应该是emploer[emp_img]
。
由于这个 emp_imp
不存在于 employer
参数中,并且不只更新 emp_img
。
尝试改变
<%= f.file_field :emp_img, required: true, name: 'picture' %>
到
<%= f.file_field :emp_img, required: true %>
这将解决您的问题。