5

ステージ

ギャラリー アプリケーションをイメージします。と の 2 つのモデルがHandcraftありPhotosます。 1 つの手工芸品には多くの写真が含まれている場合があります。たとえば、次のようなモデルがあるとします。

  • Handcraft(name:string)
  • Photo(filename:string, description:string, ...)

_form.html.erb手工芸品には、次のものがあります。

<%= form_for @handcraft, html: {multipart: true} do |f| %>
  # ... other model fields

  <div class="field">
    <%= f.label :photo %><br />
    <%= f.file_field :photo %>
  </div>

  # ... submit button
<% end %>

handcraft.rb次のようになります。

class Handcraft < ActiveRecord::Base
  attr_accessible :photo
  has_many :photos
  mount_uploader :photo, PhotoUploader
  # ... 
end

photo_uploader.rb:

class PhotoUploader < CarrierWave::Uploader::Base

  include CarrierWave::RMagick

  storage :file

  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

  version :thumb do
    process :resize_to_limit => [100, 100]
  end

  def extension_white_list
    %w(jpg jpeg gif png)
  end
end

問題

フォームを送信すると、次のエラーがスローされます。

NoMethodError (undefined method `photo_will_change!' for #<Handcraft:0xb66de424>):

質問

この場合、Carrierwave をどのように使用/設定すればよいですか?

4

1 に答える 1

11

ファイル名を保存するフィールドにアップローダーをマウントする必要があるため、モデルは次のようになります。

class Handcraft < ActiveRecord::Base
  attr_accessible :name
  has_many :photos
  # ... 
end

class Photo < ActiveRecord::Base
  attr_accessible :filename, :description
  mount_uploader :filename, PhotoUploader
  # ... 
end

そして、手作りのフォームから写真を作成するように見えるので、追加する必要があります

accepts_nested_attributes_for :photos

あなたのHandcraftクラスで

次に、フォームは次のようになります

<%= form_for @handcraft, html: {multipart: true} do |f| %>
  # ... other model fields

  <%= f.fields_for :photos do |photo| %>
    <%= photo.label :photo %><br />
    <%= photo.file_field :photo %>
  <% end %>

  # ... submit button
<% end %>

フォームに写真のフィールドを表示するには、Handcraftインスタンスをphotos作成する必要があります。これは、newメソッドで次のHandcraftsControllerように行うことができます。

def new
  @handcraft = Handcraft.new
  4.times { @handcraft.photos.build }
end

これにより、フォームで 4 つの (任意の数の) フィールドを使用できるようになります。ユーザーがフォームに新しい写真を動的に追加できるようにしたい場合は、nested_formをご覧ください。

于 2012-11-01T14:09:31.237 に答える