0

I have spent 3 days trying to solve this:

I am trying to let users upload their profile picture on my site, using Paperclip.

Everything works fine, until user clicks the Upload button ( he is able to browse and choose a picture). When clicking upload button, Paperclip does not create files (original, small, medium & thumb version of the original picture), instead I got a routing error and no folder, no file is created, the :id field in the path looks empty, and the 'paperclip's attribute' are all set to NIL...

The Users controller:

def edit
    @user = User.find(params[:id])
    @title = "Upload a profile picture"
  end

  def update
    @user = User.create(params[:user])
    @title = "Update a profile picture"
  end`

The views:

edit.html.erb:

<h1>
    Ajouter une photo au profil
</h1>

<%= form_for @user,:user, :html => { :multipart => true} do |f| %>
<div class="field">  
  <%= f.label :avatar, "Upload ta photo" %>
  <br />
  <%= f.file_field :avatar %>
</div>

<div class="actions">
    <%= f.submit "Upload" %>
</div>
<% end %>

clicks leads to update.html.erb:

<%=  image_tag @user.avatar.url %>
  <%=  image_tag @user.avatar.url(:medium) %>
  <%=  image_tag @user.avatar.url(:thumb) %>

Last but not least the model User.rb:

class User < ActiveRecord::Base
  attr_accessor :password
  attr_accessible :name, :email, :number_of_positive_reco, :confidence_percent, :password,
                  :password_confirmation, :avatar, :avatar_file_name, :avatar_content_file, :avatar_file_size, :avatar_updated_at

  has_attached_file :avatar , :styles => { :medium => "300x300>", :thumb => "100x100>"},
                    :url => "/public/images/:attachment/:id_:style.:extension",
                    :path => ":rails_root/public/images/:attachment/:id_:style.:extension"
                   # :default_url => "/images/Default_profile_picture.png"

  email_regex = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i

  validates :name, :presence => true,
  :length => { :maximum => 20}
  validates :email, :presence => true,
  :format => { :with => email_regex},
  :uniqueness => {:case_sensitive => false}
  validates :password, :presence => true,
  :confirmation => true,
  :length => { :within => 6..40 }
  validates :number_of_positive_reco, :numericality => {:only_integer => true, :greater_than_or_equal_to => 0}
  validates :confidence_percent, :numericality => { :greater_than_or_equal_to => 0.0, :less_than_or_equal_to => 1.0}

  before_save :encrypt_password
  # Return true if the user's password matches the submitted password.
  def has_password?(submitted_password)
    encrypted_password == encrypt(submitted_password)
  end

  def self.authenticate(email, submitted_password)
    user = find_by_email(email)
    return nil if user.nil?
    return user if user.has_password?(submitted_password)
  end

  def self.authenticate_with_salt(id, cookie_salt)
    user = find_by_id(id)
    (user && user.salt == cookie_salt) ? user : nil
  end

  private

  def encrypt_password
    self.salt = make_salt if new_record?
    self.encrypted_password = encrypt(password)
  end

  def encrypt(string)
    secure_hash("#{salt}--#{string}")
  end

  def make_salt
    secure_hash("#{Time.now.utc}--#{password}")
  end

  def secure_hash(string)
    Digest::SHA2.hexdigest(string)
  end

end

Here is the part of the log, where you SHOULD see paperclip written somewhere, no ?

Processing by UsersController#edit as HTML
  Parameters: {"id"=>"1"}
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1
Rendered layouts/_stylesheets.html.erb (3.6ms)
  User Load (0.9ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
Rendered layouts/_header.html.erb (7.4ms)
Rendered layouts/_footer.html.erb (2.8ms)
Rendered users/edit.html.erb within layouts/application (55.2ms)
Completed 200 OK in 194ms (Views: 62.5ms | ActiveRecord: 1.6ms)


Started POST "/users/1" for 127.0.0.1 at Fri Dec 09 19:29:19 +0100 2011
  Processing by UsersController#update as HTML
  Parameters: {"commit"=>"Upload", "authenticity_token"=>"c+OuA/dY97fPWukfu4T0nAFEFFg6ty0hK8J3qbGgTJo=", "utf8"=>"���", "id"=>"1", "user"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:0xb6f31d24 @content_type="image/png", @original_filename="castor.png", @tempfile=#<File:/tmp/RackMultipart20111209-6833-c04i1-0>, @headers="Content-Disposition: form-data; name=\"user[avatar]\"; filename=\"castor.png\"\r\nContent-Type: image/png\r\n">}}
Command :: identify -format %wx%h '/tmp/stream20111209-6833-ms72rm-0.png[0]'
Command :: convert '/tmp/stream20111209-6833-ms72rm-0.png[0]' -resize "100x100>" '/tmp/stream20111209-6833-ms72rm-020111209-6833-ipr2k4-0'
Command :: identify -format %wx%h '/tmp/stream20111209-6833-ms72rm-0.png[0]'
Command :: convert '/tmp/stream20111209-6833-ms72rm-0.png[0]' -resize "300x300>" '/tmp/stream20111209-6833-ms72rm-020111209-6833-1eterfw-0'
  User Load (0.4ms)  SELECT "users"."id" FROM "users" WHERE ("users"."email" IS NULL) LIMIT 1
Rendered layouts/_stylesheets.html.erb (3.1ms)
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" = 3 LIMIT 1
Rendered layouts/_header.html.erb (5.8ms)
Rendered layouts/_footer.html.erb (2.5ms)
Rendered users/update.html.erb within layouts/application (24.9ms)
Completed 200 OK in 930ms (Views: 31.5ms | ActiveRecord: 1.1ms)


Started GET "/images/avatars/_original.png?1323455359" for 127.0.0.1 at Fri Dec 09 19:29:20 +0100 2011

ActionController::RoutingError (No route matches "/images/avatars/_original.png"):


Rendered /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (2.5ms)


Started GET "/images/avatars/_medium.png?1323455359" for 127.0.0.1 at Fri Dec 09 19:29:20 +0100 2011

ActionController::RoutingError (No route matches "/images/avatars/_medium.png"):


Rendered /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.6ms)


Started GET "/images/avatars/_thumb.png?1323455359" for 127.0.0.1 at Fri Dec 09 19:29:20 +0100 2011

ActionController::RoutingError (No route matches "/images/avatars/_thumb.png"):


Rendered /var/lib/gems/1.8/gems/actionpack-3.0.5/lib/action_dispatch/middleware/templates/rescues/routing_error.erb within rescues/layout (1.7ms

So, everything is like: when clicking on upload, Paperclip is unable to store the files in the directory ...

In the console mode, I can set the picture without problem.

In the debug mode, I never see "paperclip" written, nowhere ... (I was expecting a [Paperclip] Saving attachment" somewhere...also, in the path of the routing error ":id" is set to "" ... instead of being the :id of the user, 4 for the 4th user...but even with a default path like "/images/" the problem remains...

Does this make you think about something I may have forgotten ?

(ImageMagick works fine, I have added the multipart true in the form, and normal user has the rights to create a folder)

Many thanks in advance for any hints!

citraL
  • 1,146
  • 1
  • 10
  • 25
  • please post the exact error messages. – Kristian Hildebrandt Dec 09 '11 at 20:14
  • 1
    You said you got a routing error, please post it. – Kristian Hildebrandt Dec 09 '11 at 20:48
  • @Kristian: it looks like this: `Started GET "/images/avatars/_original.png?1323455359" for 127.0.0.1 at Fri Dec 09 19:29:20 +0100 2011 ActionController::RoutingError (No route matches "/images/avatars/_original.png"):` I have posted my model, views and controllers there: http://stackoverflow.com/questions/8418310/paperclip-does-not-save-attachment but 45 have seen the post, and no one seems to have a clue :( ... but I also poster the whole part of the log in the original message above – citraL Dec 09 '11 at 20:54
  • please post the code of your action and your view. – Kristian Hildebrandt Dec 09 '11 at 20:59
  • @Kristian: it is posted in the original message, posted model, view, controller & log – citraL Dec 09 '11 at 21:10
  • it looks like the :id field is not recognised (should be before _thumb as :id_:style, and it's not, but the folder is not even created – citraL Dec 09 '11 at 21:24
  • Just a guess, but does this help, you're on osx right? http://stackoverflow.com/questions/6321485/paperclip-image-broken-in-rails-3-1rc4 – Kristian Hildebrandt Dec 09 '11 at 22:02
  • @Kristian Thanks for your answer. I am on Ubuntu(linux), using Ruby 1.8.7 and Rails 3.0.5, so I don't think this applies to me... – citraL Dec 10 '11 at 06:55
  • Why is a new user created in the update action? – Kristian Hildebrandt Dec 10 '11 at 17:32
  • Hmmm ... I'm new in Rails, so it might be wrong to use create in update function. I thought that user.new was creating a new user, and that user.create(params[:user]) was simply a post allowing to add extra attributes (here the picture), I first used "update_attributes" but as it was not working because of this password field (see my answer), I was trying with create. Thanks for your answer ! – citraL Dec 11 '11 at 10:16

1 Answers1

1

3 days to find this out: as I used password protection (password being attr_accessor), it's impossible to update a user, without adding the password field in the form.

Trying to edit the profile picture without entering the password does not work, and no error message that could have me made me think about this was generated.

So, in the edit view, don't forget to add the password field in the form to be able to update user's picture

citraL
  • 1,146
  • 1
  • 10
  • 25