Синатра / Carrierwave: как обновить запись, используя существующее изображение? - PullRequest
0 голосов
/ 10 октября 2011

Мое сверхпростое приложение Sinatra представляет собой список заметок, и к каждой заметке прикреплено изображение.

У меня настроен маршрут «put», который позволяет мне обновлять заметки, но если я не-загружаем изображение, я его теряю (note.image устанавливается на 'nil' при отправке формы).

Заранее спасибо за вашу помощь!

Вот мой загрузчик:

class MyUploader < CarrierWave::Uploader::Base
  include CarrierWave::MimeTypes
  process :set_content_type
  storage :fog
end

Вот мой класс заметок:

class Note
    include DataMapper::Resource
    property :id, Serial
    property :image, String, :auto_validation => false
    property :content, Text, :required => true
    property :created_at, Date
    property :updated_at, Date
    mount_uploader :image, MyUploader                   
end

Вот мой маршрут пут:

put '/:id' do
  n = Note.get params[:id]
    unless n
      redirect '/', :error => "Can't find that note."
    end
  n.image = params[:image] 
  n.credit = params[:content]
  n.date = params[:date]
  n.updated_at = Time.now
  if n.save
    redirect '/', :notice => 'Note updated successfully.'
  else
    redirect '/', :error => 'Error updating note.'
  end
end

А вот форма, которую я использую для обновления заметок:

<% if @note %>
  <form action="/<%= @note.id %>" method="post" id="edit" enctype="multipart/form-data">
    <input type="hidden" name="_method" value="put">
    <p><input type="text" name="credit" value="<%=h @note.content %>"></p>
    <p><input type="file" name="image" /></p>
    <br><br>
    <input type="submit">
  </form>
<% else %>
    <p>Note not found.</p>
<% end %>

1 Ответ

1 голос
/ 10 октября 2011

Вам нужна простая проверка if: если params[image] равен нулю, вы пропускаете n.image = params[:image]

n.image = params[:image] if params[:image]

Я использую аналогичный подход для создания пользовательской проверки валидации Rails, когда работаю с моделями ActiveRecord, которые содержат изображения CarrierWave. Вероятно, неплохо было бы проверить, действительно ли n.image также равен нулю - если оно равно нулю, я думаю, это должно быть обязательно для загрузки изображения.

...