0

Tへのaws s3でfogでcarrierwaveを使用することについてrailscastsに従いましたが、うまくいかないようです。

Gemfile は次のとおりです。

source 'https://rubygems.org'
ruby '1.9.3'
gem 'rails', '3.2.13'


# Bundle edge Rails instead:
# gem 'rails', :git => 'git://github.com/rails/rails.git'

gem 'pg'
gem 'pg_search'

gem 'devise'

gem "therubyracer"
gem "less-rails"  #Sprockets (what Rails 3.1 uses for its asset pipeline) supports LESS 
gem "twitter-bootstrap-rails", :git => 'git://github.com/seyhunak/twitter-bootstrap-rails.git'
gem "simple_form"
gem 'aws-sdk', '~> 1.8.1.2'
gem 'activerecord-reputation-system', require: 'reputation_system'
gem 'bootstrap-will_paginate'

gem 'carrierwave'
gem "rmagick"
gem "fog", "~> 1.3.1"
gem 'carrierwave-aws'

config/initializers/carrierwave.rb

require 'carrierwave'

CarrierWave.configure do |config|
  config.fog_credentials = {
    provider: "AWS",
    aws_access_key_id: ENV["xxx"],
    aws_secret_access_key: ENV["yyy"], 
    region: ENV['ap-southeast-1']
  }

  config.cache_dir = "#{Rails.root}/tmp/uploads"
  config.fog_directory = ENV["ABC"]
end

アップローダ:

class ImageUploader < CarrierWave::Uploader::Base
require 'carrierwave/processing/mime_types'

  before :store, :remember_cache_id
  after :store, :delete_tmp_dir

  # Include RMagick or MiniMagick support:
  include CarrierWave::RMagick
  # include CarrierWave::MiniMagick

  # Include the Sprockets helpers for Rails 3.1+ asset pipeline compatibility:
  include Sprockets::Helpers::RailsHelper
  include Sprockets::Helpers::IsolatedHelper

  # Choose what kind of storage to use for this uploader:
  # storage :file
  storage :fog

  include CarrierWave::MimeTypes

  process :set_content_type
  # Override the directory where uploaded files will be stored.
  # This is a sensible default for uploaders that are meant to be mounted:
  def store_dir
    "uploads/#{model.class.to_s.underscore}/#{mounted_as}/#{model.id}"
  end

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

   # store! nil's the cache_id after it finishes so we need to remember it for deletion
  def remember_cache_id(new_file)
    @cache_id_was = cache_id
  end

  def delete_tmp_dir(new_file)
    # make sure we don't delete other things accidentally by checking the name pattern
    if @cache_id_was.present? && @cache_id_was =~ /\A[\d]{8}\-[\d]{4}\-[\d]+\-[\d]{4}\z/
      FileUtils.rm_rf(File.join(root, cache_dir, @cache_id_was))
    end
  end
end

コントローラー:

class NotesController < ApplicationController
    before_filter :authenticate_user!, only: [:create, :destroy]
    before_filter :correct_user,   only: :destroy

    def index
    end

    def create
        @note = current_user.notes.build(params[:note])
        @notes = Note.paginate(page: params[:page])
    if @note.save
      flash[:success] = "Note uploaded!"
      redirect_to root_url
    else
        flash.now[:error] = "Note failed to upload."
      render 'static_pages/home'
    end
    end

    def destroy
        @note.destroy
        flash[:success] = "Note deleted."
        redirect_to root_url
    end

private

    def correct_user
      @note = current_user.notes.find_by_id(params[:id])
      redirect_to root_url if @note.nil?
    end
end

問題が宝石にあるのかコントローラーにあるのかはよくわかりません。コントローラーでさえ、Michael Hartl の著書「The Ruby on Rails Tutorial」の microposts コントローラーに基づいているため、どこが間違っているのかわかりません。

4

1 に答える 1