为什么回形针不能保存上传的图像?

时间:2017-06-29 01:54:56

标签: ruby-on-rails paperclip

我有一个名为雇主的模型,我正在使用回形针上传图像。它以前工作但由于某种原因,它已停止工作。我要求用户填写一份表格,其中包括姓名,公司和个人资料照片。在我的控制器中,我设置了它,以便在出现问题时不会提交表单。如果表单被提交,则用户被重定向到主页,如果出现问题,则再次呈现表单。现在,表单已提交。在我的开发日志中,图片的名称也在那里。我的开发长期看起来像这样(我在这里更新表单,与新表单相同的概念):

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控制台并查看该特定雇主的数据时,除了图像之外的所有其他内容都会更新。图像显示“无”。

这是我的表格:

<%= 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) %>

请告诉我需要更改的内容或您是否需要更多信息。我知道开发日志显示的参数多于表单中的参数,我删除了一些参数以简化问题。

2 个答案:

答案 0 :(得分:0)

你的 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对象后,临时文件将被移动到您指定的文件夹,然后保存目录路径。 / p>

您应该删除file_field中的name属性。

答案 1 :(得分:0)

在你的表格中,如果仔细观察。您可以看到,您可以将name属性更改为应为emploer[emp_img]的图片。

由于emp_imp参数中没有此employer,而且仅更新emp_img

尝试更改

<%= f.file_field :emp_img, required: true, name: 'picture' %>

<%= f.file_field :emp_img, required: true %>

这将解决您的问题。