0

イメージのアップロード用にcarrierwave gemがインストールされています。 value_type3に等しいをvaluesに適用する必要があります。ここで私が試したことがあります。Rails - モデルにifステートメントを挿入するにはどうすればよいですか?

以下のコードではエラーは発生しませんが、ifステートメントが存在しないかのように違いはありません。

mount_uploader :value, CheckItemValueImageUploader, if: 'value_type == 3' 

Iは非画像タイプ(3以外value_type有するもの)のために働くが、#<ActionDispatch::Http::UploadedFile:0x007fe74b2e2e28>代わりにimage-name.png

if :value_type == 3 
mount_uploader :value, CheckItemValueImageUploader 
else 
end 

として画像を保存し、それ以下のコードを試して、私はまた、これもこの試み最初の試みのように、if条件が適用されていないかのように無視されます。

mount_uploader :value, CheckItemValueImageUploader, if: :image? 

def image? 
    self.value_type == 3 
end 

イメージmount_uploader :value, CheckItemValueImageUploaderは画像を保存しますが、その他の値の型は保存しません(テキストなど)。if文でこれを修正する必要があります。私はなぜ2番目のオプションdoesntの仕事を知っていないが、私はレールの知識の私の範囲外のいくつかのランダムな理由を確信しています。私は実際にここに誰かが実用的な解決策を持つことを望んでいます。

答えて

1

通常あなたがブロックを使用する必要があります:oはモデルのインスタンスである

mount_uploader :value, CheckItemValueImageUploader, if: proc { |o| o.value_type == 3 } 

アプリ/モデル/ base_model:

しかし、様々な目的のためにACシングルフィールドを使用する適切な方法は、あなたが様々なケースのための単一の親テーブルのクラス、およびサブクラスを持つことになりますので、STIを使用することです。 RB

class BaseModel < AR::Base 
end 

アプリ/モデル/ base_models/pic.rb

class Pic < BaseModel 
    mount_uploader :value, CheckItemValueImageUploader # value as an image 
end 
あなたは base_modelsテーブルに typeフィールドを追加する必要が

class Text < BaseModel 
    # value as a string 
end 

アプリ/モデル/ base_models/text.rb

+0

私は '、if:proc {| o | o.value_type == 3} 'しかし、何もしなかった(私が持っていた最初と3回目と同じ)。値を持つ 'items'を持っているので、必要です。これらの値は、長いスラブのテキスト、1つか2つの単語、リンクなど、それらが保持する情報によって変わることがあります(' value_type'は、私はアイテムのためにアップロードされる画像の能力を値として追加しています。もし私がそれのためにまったく新しい列を作るなら、それは多くのコアコーディングの変更を引き起こすでしょう。パス – Rob

+0

残念ながら、この時点でSTIを実装するには遅すぎます。私は多くのコーディングをやり直す必要があります。なぜ、if:proc {| o | o.value_type == 3} 'は動作しませんか?または私の他の方法は働かない。それが働いていない理由を知ってうれしいので、私はそれが終わりかどうか、あるいは希望があるかどうかを知っています。 – Rob

+0

私の答えに_if_オプションが機能しない理由が説明されています。どの値/ procを_if_に渡すかは関係ありませんが、 'mount_uploader'メソッドはそれを使用しません。私はSTIの使用について@МалъСкрылевъの意見を2番目にします。 –

0

私があればへの参照を見つけることができません。でmount_uploader方法マニュアルのオプション:

http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Mount:mount_uploader

どちらも、それが最新の安定バージョン(0.11)のソースに記載されています。

https://github.com/carrierwaveuploader/carrierwave/blob/17ae595237339ea9372aa4b9144387c5041b32f0/lib/carrierwave/mount.rb

は、あなたが車とそれを混同していないよろしいですrierWave :: Uploader :: Versions :: ClassMethods#それをサポートするバージョンメソッド?

http://www.rubydoc.info/github/jnicklas/carrierwave/CarrierWave/Uploader/Versions/ClassMethods#version-instance_method

+0

さて、彼らは何も持っていなかったが、彼らはdiddntを確認した。そういうわけで私はキャリアウェーブのモデルとは無関係なやり方でモデルでそれをやろうとしています。 – Rob

関連する問題