Скрепка: оставайтесь на месте - PullRequest
4 голосов
/ 05 января 2011

Когда пользователь редактирует что-то в моем приложении, он вынужден повторно загрузить свое изображение с помощью скрепки, даже если он не меняет его. Невыполнение этого требования приведет к ошибке, так как я validate_presence_of: image. Это довольно раздражает.

Как я могу сделать так, чтобы Paperclip не обновлял свои атрибуты, если пользователь просто не предоставил новое изображение для редактирования?

Фотоконтроллер только что из генератора Rails. Остальная часть исходного кода приведена ниже.

Модели / accommodation.rb

class Accommodation < ActiveRecord::Base
  attr_accessible :photo
  validates_presence_of :photo
  has_one :photo
  has_many :notifications
  belongs_to :user
  accepts_nested_attributes_for :photo, :allow_destroy => true
end

Контроллеры / accommodation_controller.rb

class AccommodationsController < ApplicationController
  def index
    @accommodations = Accommodation.all
  end

  def show
    @accommodation = Accommodation.find(params[:id])
    rescue ActiveRecord::RecordNotFound
      flash[:error] = "Accommodation not found."
      redirect_to :home
  end

  def new
    @accommodation = current_user.accommodations.build
    @accommodation.build_photo
  end

  def create
    @accommodation = current_user.accommodations.build(params[:accommodation])
    if @accommodation.save
      flash[:notice] = "Successfully created your accommodation."
      redirect_to @accommodation
    else
      @accommodation.build_photo
      render :new
    end
  end

  def edit
    @accommodation = Accommodation.find(params[:id])
    @accommodation.build_photo
    rescue ActiveRecord::RecordNotFound
      flash[:error] = "Accommodation not found."
      redirect_to :home
  end

  def update
    @accommodation = Accommodation.find(params[:id])
    if @accommodation.update_attributes(params[:accommodation])
      flash[:notice] = "Successfully updated accommodation."
      redirect_to @accommodation
    else
      @accommodation.build_photo
      render :edit
    end
  end

  def destroy
    @accommodation = Accommodation.find(params[:id])
    @accommodation.destroy
    flash[:notice] = "Successfully destroyed accommodation."
    redirect_to :inkeep
  end

end

Модели / photo.rb

class Photo < ActiveRecord::Base
  attr_accessible :image, :primary
  belongs_to :accommodation
  has_attached_file :image,
    :styles => {
      :thumb=> "100x100#",
      :small  => "150x150>" }
end

1 Ответ

1 голос
/ 05 января 2011

Вам не нужно @accommodation.build_photo где-либо еще, кроме new действия.

...