1

私はプロフィールをモデル化しました

class Profile < Abstract
    has_attached_file :avatar,                   
    ...
    validates_attachment_size :avatar, :less_than => 2.megabytes
    validates_attachment_content_type :avatar, :content_type => ['image/jpeg', 'image/png', ...]
    # Many other validations
end

2 つの異なるフォームがあります。1 つはアバター用で、もう 1 つは他のすべてのフィールド用です。ユーザーは、2 番目のフォームに入力せずにアバターを保存できる必要があります。他のすべての検証をスキップして、クリップの添付ファイルのみを検証することは可能ですか? この答えに続いて、私はこのようにしようとしました:

class Abstract < ActiveRecord::Base  
    def self.valid_attribute?(attr, value)
        mock = self.new(attr => value)
        unless mock.valid?
           return !mock.errors.has_key?(attr)
        end
        true
    end
end

そしてコントローラーで

def update_avatar
    if params[:profile] && params[:profile][:avatar].present? && Profile.valid_attribute?(:avatar, params[:profile][:avatar])
        @profile.avatar = params[:profile][:avatar]
        @profile.save(:validate => false)
        ...
    else
        flash.now[:error] = t :image_save_failure_message
        render 'edit_avatar'
    end
end

しかし、ペーパークリップには機能しませんでした。Profile.valid_attribute?(:avatar, params[:profile][:avatar])常に true を返します。

4

1 に答える 1

0

このすべての魔法を実行しようとする代わりに、次のように、イメージ モデルとなる個別のイメージ モデルまたはアバター モデルを作成します。

class Attachment < ActiveRecord::Base

  belongs_to :owner, :polymorphic => true

  has_attached_file :file,
                :storage => :s3,
                :s3_credentials => "#{Rails.root}/config/s3.yml",
                :s3_headers => {'Expires' => 5.years.from_now.httpdate},
                :styles => { :thumbnail => "183x90#", :main => "606x300>", :slideshow => '302x230#', :interview => '150x150#' }

  def url( *args )
    self.file.url( *args )
  end

end

これを取得したら、関係を作成します。

class Profile < Abstract
  has_one :attachment, :as => :owner, :dependent => :destroy
end

次に、フォームで、モデルに関係なく最初に添付ファイルを保存してから、添付ファイルを設定するプロファイルを保存しようとします。次のようなものかもしれません:

def create

  @attachment = if params[:attachment_id].blank?
    Attachment.create( params[:attachment )
  else
    Attachment.find(params[:attachment_id])
  end

  @profile = Profile.new(params[:profile])
  @profile.image = attachment unless attachment.new_record?
  if @profile.save
    # save logic here
  else
    # else logic here
  end 
end

次に、あなたの見解では、プロファイルが無効であった場合、新しく保存された添付ファイルをフォームに送信し、再度作成する代わりにそれを再利用します。

于 2012-05-16T11:57:51.373 に答える