1

CarrierWave がモデルのアソシエーションと相互作用する方法、または私の場合、CarrierWave が相互作用しない方法について簡単な質問があります。所有者からのデータを使用して、CarrierWaveとbelongs_toを設定したいと考えています。しかし、のようなものを呼び出すと、nil クラスに がないことを示す NoMethodError が返されることがわかりました。cache_dirstore_dirmodel.other_model.attributeattribute

それは私ができる限り言語言語に翻訳されています。実際のコードは次のとおりです。

# app/models/correction.rb
class Correction < ActiveRecord::Base
  belongs_to :submission, inverse_of: :corrections
  belongs_to :contract, inverse_of: :corrections

  mount_uploader :pdf, CorrectionsUploader
end

# app/models/contract.rb
class Contract < ActiveRecord::Base
  belongs_to :author, inverse_of: :contracts
  belongs_to :submission, inverse_of: :contract
  has_many :corrections, inverse_of: :contract

  mount_uploader :pdf, ContractUploader
end

# app/uploaders/corrections_uploader.rb
class CorrectionsUploader < FogCorrectionsUploader
  include ::CarrierWave::Backgrounder::Delay
  include CarrierWave::RMagick
  include CarrierWave::MimeTypes

  storage :fog

  def store_dir
    "corrections/#{model.contract.legal_name}/#{model.contract.titles}"
  end

  def cache_dir
    "/www/website.com/_www/shared/submissions/corrections/#{model.contract.legal_name}/#{model.contract.titles}"
  end

  def extension_white_list
    %w(pdf)
  end
  # ...some processing directives that don't seem relevant...
end

コントローラーはフォームからsubmission_idandを取得し、それらと otherを呼び出します。これにより、予想どおり CarrierWave がトリガーされ、 が nilness であるためエラーがスローされます。contract_idCorrection.newcorrection_paramsmodel.contract

ORM は私にとっていまだに暗い大陸なので、Rails コンソールを起動してこれを実行してみましたが、問題はありませんでした。

2.0.0 :002 > test_correction = Correction.new({contract_id: 18, submission_id: 161})
    => #<Correction id: nil, submission_id: 161, contract_id: 18, pdf: nil, created_at: nil, updated_at: nil, comment: nil, delivered: nil>
2.0.0 :003 > test_correction.submission
    D, [2013-10-12T21:14:31.352684 #1758] DEBUG -- :   Submission Load (15.3ms)  SELECT "submissions".* FROM "submissions" WHERE "submissions"."id" = $1 ORDER BY "submissions"."id" ASC LIMIT 1  [["id", 161]]
    => #<Submission id: 161, title: ...>

だから、CarrierWave について何かが欠けているように思えます---間違いなくばかげたことです--- CarrierWave についてですが、もちろんよくわかりません。これが恥ずかしいほど明白になることは間違いありませんが、誰かが持っている提案には本当に感謝しています. 前もって感謝します!

4

1 に答える 1

0

同様の問題を抱えている他の誰かがこれに遭遇した場合に備えて、私は自分のフォームに問題があることを発見しました. フォームの最後、アップロード ボタンの後、および strong-parameters呼び出しの最後にhidden_fields を配置contract_idsubmission_idました。どうやら Rails はパラメーターを受け取った順序で処理しようとしていて、 と に値を割り当てる前にアップローダーに到達していたため、つまずいたようです。permit()contract_idsubmission_id

于 2013-10-13T12:28:08.813 に答える