2017-06-29 98 views
1

我有一個模型叫僱主,我用回形針上傳圖片。它之前正在工作,但由於某種原因,它已停止工作。我要求用戶填寫名稱,公司名稱和個人資料圖片。在我的控制器中,我已經設置了它,所以如果出現錯誤,表單不會被提交。如果表單被提交,用戶會被重定向到主頁,如果出現錯誤,表單會被重新渲染。現在,表單被提交。在我的開發日誌中,圖片的名稱也在那裏。我的長期發展看起來像這樣(我在這裏更新形式,相同的概念,新的形式):回形針爲什麼不保存上傳圖片?

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"=>"[email protected]"}, "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) 

正如你所看到的,用的名字PIC「a8xds6.png」是在第三行顯示。但我不確定它爲什麼作爲臨時文件提交。

當我打開導軌控制檯並查看特定僱主的數據時,除圖像以外的所有內容都會更新。圖像說「無」。

這是我的形式:

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

請讓我知道我需要更改或需要更多信息。我知道開發日誌顯示的參數比表單中的要多,我刪除了一些參數來簡化問題。

回答

0

在您的表格中,如果仔細觀察。您可以看到,您可以將名稱屬性更改爲應該是emploer[emp_img]的圖片。

由於此emp_imp不存在employer params,而不是隻更新emp_img

嘗試改變

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

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

這將解決您的問題。

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文件夾中的臨時文件和軌道將與ActionDispatch處理它,你的Rails對象保存後的臨時文件將被移動到您指定的文件夾,然後保存目錄路徑。

您應該刪除file_field中的name屬性。

+0

圖片沒有嵌套在僱主內這種方法會通過一個錯誤 –

+0

編輯我的答案,但我認爲自定義名稱屬性是沒有必要的。 –

+0

圖片沒有必要,因爲f.emp_imp本身創建僱主[emp_img]。在你的回答中你已經在僱主內部添加了照片。但圖片參數分開來。它不會通過一個錯誤,但它不會在保存記錄。 –

相關問題