Я потратил 3 дня, пытаясь решить эту проблему:
Я пытаюсь разрешить пользователям загружать свое изображение профиля на мой сайт, используя Paperclip.
Все работает нормально, пока пользователь не нажметКнопка загрузки (он умеет просматривать и выбирать картинку).При нажатии на кнопку загрузки, Paperclip не создает файлы (оригинальная, маленькая, средняя и большая версии исходного изображения), вместо этого я получил ошибку маршрутизации и ни одна папка, файл не создается, поле: id в пути выглядит пустым,и «атрибут скрепки» все установлены в NIL ...
Контроллер пользователей:
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`
Просмотры:
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 %>
клики приводят к обновлению .html.erb:
<%= image_tag @user.avatar.url %>
<%= image_tag @user.avatar.url(:medium) %>
<%= image_tag @user.avatar.url(:thumb) %>
Последняя, но не менее важная модель 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
Вот часть журнала, где вы ДОЛЖНЫ увидеть где-нибудь скрепку, не так ли?
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
Итак, все похоже на то, что при нажатии кнопки «Выгрузка» Paperclip не может сохранитьфайлы в каталоге ...
В режиме консоли я могу без проблем установить изображение.
В режиме отладки я никогда не вижу написанного "скрепки", нигде ... (Я ожидал [Paperclip] Сохранение вложения "где-то ... также, на пути ошибки маршрутизации": id "isустановить "" ... вместо того, чтобы быть: id пользователя, 4 для 4-го пользователя ... но даже с путем по умолчанию, таким как "/ images /" проблема остается ...
это заставляет вас думать о чем-то, что я, возможно, забыл?
(ImageMagick отлично работает, я добавил multipart true в форму, и обычный пользователь имеет права на создание папки)
Многиезаранее спасибо за любые подсказки!