Скрепка не сохраняет вложения - PullRequest
4 голосов
/ 07 декабря 2011

Я новичок в Rails и веб-разработке ...

Я создал модель User, и сейчас я пытаюсь дать пользователю возможность добавлять изображение профиля, используя Paperclip.

На моей странице показа пользователь может щелкнуть ссылку, чтобы открыть страницу редактирования, на которой он может просмотреть форму для просмотра и выбрать изображение для загрузки.При нажатии на кнопку он вызывает действие «обновление» и перенаправляет на страницу показа пользователя, но изображение не сохраняется ни в одной папке, а атрибуты изображения (имя файла, тип содержимого, размер файла) по-прежнему имеют значение NIL в базе данных..

  • Я установил и протестировал ImageMagick
  • Я добавил :multipart => true в виде
  • Я поставил attr_accessible: avatar
  • Я установил параметры скрепки для поиска '/ usr / bin /', где находится convert
  • Я запустил миграцию
  • У меня установлено: url и: path

- в контроллере моё действие по обновлению:

def update
  @user = User.find(params[:id])
  @title = "Update profile picture"
  response_to do |format|
  if @user.update_attributes(params[:user])
    format.html {redirect_to(@user, :notice => 'Profile picture loaded')}
  else
    format.html {render :action => "edit", :notice => 'Unable to load pic")}
  end
  end
 end

Код моей модели:

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

  has_attached_file :avatar , :styles => { :medium => "300x300>", :thumb => "100x100>"},
                    :url => "/images/profiles/:attachment/:id_:style.:extension",
                    :path => ":rails_root/public/images/profiles/: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

Форма находится в edit.html.erb:

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

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

И я распечатал отладочную информацию в браузере.После нажатия кнопки «Загрузить» я получил следующее:

{"commit"=>"Upload", "authenticity_token"=>"+ExcuQOSv1bxIyAoM5+N4TCSmYI8JYeh5Yb8P5W4VU0=", "_method"=>"put", "utf8"=>"✓", "action"=>"update", "id"=>"8", "controller"=>"users", "user"=>{"avatar"=>#<ActionDispatch::Http::UploadedFile:0xb6d63fec @content_type="image/jpeg", @original_filename="Paperclip-Railway.jpg", @tempfile=#<File:/tmp/RackMultipart20111208-1681-3h3ps4-0>, @headers="Content-Disposition: form-data; name=\"user[avatar]\"; filename=\"Paperclip-Railway.jpg\"\r\nContent-Type: image/jpeg\r\n">}}

Итак, в журнале я вижу, что «поля скрепки» заполнены именем изображения, типом изображения и т. Д., Но нет «INSERT».в TABLE ", все пользовательские поля по-прежнему равны NIL, системный каталог, в котором должно храниться изображение пользователя, не создано, в журнале нет ни" сохранения вложения ", ни упоминания о скрепке в журнале ...

В режиме консоли я могу создать нового пользователя, установив атрибуты аватара следующим образом:

`User.create (: avatar => File.new (Rails.root +" public / images / an_image.png ")) ´

и все работает просто отлично! ... Я также проверил создание новой папки, без прав администратора, и все работает нормально ... Я перестал работать: - (

Кто-нибудь может мне помочь?

1 Ответ

2 голосов
/ 11 декабря 2011

3 дня, чтобы выяснить это: поскольку я использовал защиту паролем (пароль attr_accessor), невозможно обновить пользователя без добавления поля пароля в форме.

Попытка отредактировать изображение профиля без ввода пароля не работает, и никакое сообщение об ошибке, которое могло бы заставить меня задуматься, не было сгенерировано.

Итак, в представлении редактирования не забудьте добавить поле пароля в форму, чтобы иметь возможность обновить изображение пользователя!

...