2017-06-29 6 views
1

Ich habe ein Modell namens Arbeitgeber und ich benutze Büroklammer, um Bilder hochzuladen. Es hat vorher funktioniert, aber aus irgendeinem Grund hat es aufgehört zu arbeiten. Ich bitte den Benutzer, ein Formular mit Name, Firma und einem Profilbild auszufüllen. In meinem Controller habe ich es so eingestellt, dass das Formular nicht gesendet wird, wenn etwas nicht stimmt. Der Benutzer wird auf die Startseite weitergeleitet, wenn das Formular gesendet und das Formular erneut wiedergegeben wird, wenn etwas nicht stimmt. Jetzt wird das Formular gesendet. In meinen Entwicklungsprotokollen ist auch der Name des Bildes angegeben. Meine Entwicklung sieht lange so (ich bin Aktualisierung hier das Formular, das gleiche Konzept wie neue Form):Warum speichert Paperclip das hochgeladene Bild nicht?

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) 

Wie Sie sehen können, das Bild mit dem Namen „a8xds6.png“ auf der dritten Zeile dargestellt ist. Aber ich bin mir nicht sicher, warum es als temporäre Datei eingereicht wurde.

Wenn ich die Schienenkonsole öffne und die Daten dieses bestimmten Arbeitgebers sehe, wird alles andere außer dem Bild aktualisiert. Das Bild sagt "Null".

Das ist meine Form:

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

Controller:

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 

Arbeitgeber Modell:

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 

Ausblick:

<%= image_tag @employer.emp_img.url(:profile_pic) %> 

Bitte lassen Sie mich wissen, was ich ändern muss oder wenn Sie weitere Informationen benötigen. Ich weiß, dass die Entwicklungsprotokolle mehr Parameter als die in den Formularen zeigen, habe ich einige Parameter entfernt, um die Frage zu vereinfachen.

Antwort

0

In Ihrem Formular, wenn Sie genau hinsehen. Sie können sehen, dass Sie die Eigenschaft name in ein Bild ändern können, das emploer[emp_img] lauten sollte.

Aufgrund dieser emp_imp nicht in employer Params enthalten, und nicht nur emp_img aktualisieren.

Versuchen Änderung

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

zu

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

dies Ihr Problem lösen wird.

0

Ihr emp_img file_field sollte kein benutzerdefiniertes Namensattribut haben, wenn Sie dies tun, sollten Sie es zulassen und einen attr_accessor hinzufügen.

private 
    def employer_params   
     params.require(:employer).permit(:name, :company, :emp_img, :picture) 
    end 

Arbeitgeber Modell:

class Employer < ActiveRecord::Base 
    [...] 
    attr_accessor :picture 
    [...] 
end 

Das Hochladen von Dateien auf den Server wird als temporäre Datei in tmp-Ordner gespeichert werden und Schienen wird es mit ActionDispatch handhaben, nachdem Ihre Schienen die temporäre Datei wird verschoben gespeichertes Objekt in den Ordner, den Sie angegeben haben, und speichern Sie den Verzeichnispfad.

Sie sollten das name-Attribut in file_field entfernen.

+0

Bild nicht verschachtelt innerhalb des Arbeitgebers diese Methode wird durch einen Fehler –

+0

Bearbeitete meine Antwort, aber ich denke, das benutzerdefinierte Name Attribut ist nicht notwendig. –

+0

Bild ist nicht notwendig, weil f.emp_imp selbst den Arbeitgeber [emp_img] erstellt. In Ihrer Antwort haben Sie ein Bild innerhalb des Arbeitgebers hinzugefügt. Aber Bildparameter kommen getrennt. Es wird nicht durch einen Fehler, aber es spart nichts beim Speichern. –

Verwandte Themen