4

そのため、画像のアップロード用に Carrierwave を非常に簡単に実装しています。アップローダを ActiveRecord モデルにマウントしました。

class MenuItem < ActiveRecord::Base
    attr_accessible :description, :menu_id, :name, :active, :photo

    mount_uploader :photo, PhotoUploader

    belongs_to :menu

    before_save :default_values

    validates :name, presence: true
    validates :menu_id, presence: true
    validates :description, length: { maximum: 250 }

    private
       def default_values
         if (self.active.nil?)
           self.active = true
         end
       end  
end

私が使用しているフォームは、上記の MenuItem の編集/作成とファイルの添付を組み合わせたものです。

    <%= form_for(@menuitem) do |f| %>
        <%= render 'shared/error_messages', object: @menuitem %>

        <%= f.file_field :photo, :id => "photo" %>

        <%= f.label :name %>
        <%= f.text_field :name %>

        <%= f.label :description %>
        <%= f.text_area :description %>

        <%= f.label :active %>
        <%= f.check_box :active, :value => @menuitem.active %>

        <%= f.submit "Save Menu Item", class: "btn btn-large btn-primary" %>
        <%= f.submit "Cancel", class: "btn btn-large btn-secondary" %>
    <% end %>

編集/更新の場合、すべてが機能します。

ただし、新規/作成では、:photo 属性で「写真が無効です」という検証エラーが発生します。アップローダの定義はバニラです。

class PhotoUploader < CarrierWave::Uploader::Base
  include CarrierWaveDirect::Uploader

  after :store, :make_thumbnail

  storage :fog

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

  def make_thumbnail(file)
    a = filename.split('/')
    key = store_dir + "/" + a[0] + "/" + model.id.to_s + "_thumb.jpg"

    job = Blitline::Job.new(url)
    job.application_id = ENV['BLITLINE_APPLICATION_ID']

    sf = job.add_function("resize_to_fill", {:height => 100, :width => 100})
    sf.add_save("thumbnail", key, ENV['S3_BUCKET'])

    bs = Blitline.new
    bs.jobs << job   
    res = bs.post_jobs
  end
end

また、コントローラーのメソッドもシンプルです

class MenuItemsController < ApplicationController
  def new
    @menuitem = MenuItem.new
    @menuitem.menu_id = params[:menuid]
    @menuitem.active = true
  end

  def create
    @menuitem = MenuItem.new(params[:menu_item])

    if @menuitem.save
        flash[:success] = "Menu Item created!"
        redirect_to menu_path(@menuitem.menu)
    else
        render 'new'
    end    
end

model.id問題はアップローダのメソッドでの参照に関連している可能性store_dirがあり、レコードがまだ作成されていないため ID が利用できないと考えましたが、それを削除しても問題は解決しませんでした。

繰り返しますが、同じフォームを使用して単純に呼び出す編集/更新パスはmenuitem.update_attributes(params[:menu_item])正常に機能します。

私が見逃している明らかな何かがあると確信しています。どんな提案でも大歓迎です!

4

4 に答える 4

0

提案があります:

ホワイトリストのフォーマット (アップローダー内):

  def extension_white_list
   %w(jpg jpeg gif png)
  end
于 2012-12-10T15:36:15.137 に答える
0

Carrierwave.rb ファイルで以下を設定する必要があります

  config.validate_unique_filename = false
  config.validate_filename_format = false
  config.validate_remote_net_url_format = false # this is important

これは私にとってはうまくいきます。個人的には、Fog よりもはるかにスリムなため、現在は Carrierwave-aws を使用しています。

于 2015-02-22T13:43:11.210 に答える