質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

89.53%

Carrierwaveで画像のアップロードができない

受付中

回答 0

投稿

  • 評価
  • クリップ 0
  • VIEW 90

発生している問題・エラーメッセージ

開発環境・本番環境において、
ユーザー登録及び更新の際に、入力フォームで画像ファイルを指定せずにユーザー作成をすると、
デフォルト画像が登録され、ユーザーの詳細画面にリダイレクトされます。
(※コンソールで確認すると、DB上ではimage属性はnil)

しかし、入力フォームで画像ファイルを指定し、ユーザー作成を行うと、
「このサイトにアクセスできません(ERR_ACCESS_DENIED)」と表示されてしまいます。
エラーが発生している時点でのURLはユーザーの詳細画面のURLとなっています。
(開発環境での例: http://localhost:3000/users/12)

原因となっていそうなファイルを見直しましたが、エラーを解消できませんでした。。

上記のエラーを解消し、Carrierwaveでの画像アップロードを可能にしたいです。

該当のソースコード

### routes.rb

Rails.application.routes.draw do

  root 'static_pages#home'
  get '/help', to: 'static_pages#help'
  get '/about', to: 'static_pages#about'
  get '/contact', to: 'static_pages#contact'
  get '/signup', to: 'users#new'
  post '/signup', to: 'users#create'
  get    '/login',   to: 'sessions#new'
  post   '/login',   to: 'sessions#create'
  delete '/logout',  to: 'sessions#destroy'
  resources :users
  resources :facilities, only: [:show, :edit, :new, :create, :update, :destroy]

end
### image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base
  # Include RMagick or MiniMagick support:
  # include CarrierWave::RMagick
  include CarrierWave::MiniMagick
  process resize_to_limit: [400, 400]

  # Choose what kind of storage to use for this uploader:
  if Rails.env.production?
    storage :fog
  else
    storage :file
  end

  # 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



  # Provide a default URL as a default if there hasn't been a file uploaded:
  def default_url(*args)
  #   # For Rails 3.1+ asset pipeline compatibility:
  #ActionController::Base.helpers.asset_path("fallback/" + [version_name, "default.png"].compact.join('_'))
    "default.jpg"
  end

  # Create different versions of your uploaded files:
  version :thumb do
    process resize_to_fit: [50, 50]
  end

  # Add a white list of extensions which are allowed to be uploaded.
  # For images you might use something like this:
  def extension_whitelist
    %w(jpg jpeg gif png)
  end

end
### user.rb

class User < ApplicationRecord
  before_save { self.email = email.downcase }
  mount_uploader :image, ImageUploader
  has_many :facilities, dependent: :destroy

  VALID_EMAIL_REGEX = /\A[\w+\-.]+@[a-z\d\-.]+\.[a-z]+\z/i
  validates :name, presence: true,
                   length: {maximum: 50}
  validates :email, presence: true,
                    length: {maximum: 255},
                    format: { with: VALID_EMAIL_REGEX },
                    uniqueness: {case_sensitive: false}

  has_secure_password
  validates :password, presence: true, length: {minimum: 6}
  validate :image_size

  private
    def image_size
      if image.size > 5.megabytes
        error.add(:image, 'サイズは5MB以下となります')
      end
    end

end
### users_controller.rb

class UsersController < ApplicationController
  before_action :logged_in_user, only: [:show, :edit, :update, :destroy]
  before_action :correct_user, only: [:show, :edit, :update, :destroy]

  def show
    @user = User.find(params[:id])
    @facilities = @user.facilities
  end

  def new
    @user = User.new
  end

  def create
    @user = User.new(user_params)
    if @user.save
      log_in @user
      flash[:success] = @user + "さん、ようこそ"
      redirect_to @user
    else
      render 'new'
    end
  end

  def edit
    @user = User.find(params[:id])
  end

  def update
    @user = User.find(params[:id])
    if @user.update_attributes(user_params)
      flash[:success] = "プロフィールを更新しました"
      redirect_to @user
    else
      render 'edit'
    end
  end

  def destroy
    @user = User.find(params[:id])
    if current_user?(@user)
      @user.destroy
      flash[:success] = "ユーザー情報を削除しました。"
      redirect_to root_url
    else
      flash[:danger] = '削除できませんでした‥'
      redirect_to edit_user_url(@user)
    end
  end

  private

    def user_params
      params.require(:user).permit(:name,
                                   :email,
                                   :password,
                                   :password_confirmation,
                                   :image)
    end



    def correct_user
      @user = User.find(params[:id])
      redirect_to root_url unless current_user?(@user)
    end

end
### show.html.erb

<% provide(:title, @user.name) %>
<div class="row">
  <aside class="col-md-4">
    <section class="user_info">
      <h1>
        <%= image_tag @user.image.thumb.url, :class => "thumbnail thumbnail_edit" %>
        <%= @user.name %>
      </h1>
    </section>
  </aside>

</div>
### new.html.erb

<% provide(:title, 'Sign up') %>
<h1>アカウント作成</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user, url: signup_path) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>

      <%= f.label :name %>
      <%= f.text_field :name, class: 'form_control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form_control'  %>

      <%= f.label :image %>
      <%= f.file_field :image, accept: 'image/jpg,image/jpeg,image/gif,image/png', class: 'form_control'  %>

      <%= f.label :password %>
      <%= f.password_field :password, class: 'form_control'  %>

      <%= f.label :password_confirmation %>
      <%= f.password_field :password_confirmation, class: 'form_control'  %>

      <%= f.submit "アカウント作成", class: "btn btn-primary" %>
    <% end %>

    <script type="text/javascript">
      $('#user_image').bind('change', function() {
        var size_in_megabytes = this.files[0].size/1024/1024;
        if (size_in_megabytes > 5) {
          alert('プロフィール画像は5MB以下のものを指定してください');
        }
      });
    </script>
  </div>
</div>
### edit.html.erb

<% provide(:title, "Edit user") %>
<h1>設定</h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">
    <%= form_for(@user) do |f| %>
      <%= render 'shared/error_messages', object: f.object %>

      <%= image_tag @user.image.thumb.url, :class => "thumbnail thumbnail_edit" %>


      <%= f.label :name %>
      <%= f.text_field :name, class: 'form-control' %>

      <%= f.label :email %>
      <%= f.email_field :email, class: 'form-control' %>



      <%= f.label :image %>
      <%= f.file_field :image, class: 'form_control'  %>


      <%= f.label :password %>
      <%= f.password_field :password, class: 'form-control' %>

      <%= f.label :password_confirmation %>
      <%= f.password_field :password_confirmation, class: 'form-control' %>

      <%= f.submit "保存する", class: "btn btn-primary" %>
      <hr>
      <% if current_user?(@user) %>
      <%= link_to '削除する', @user, method: :delete, class: "btn btn-danger",
            data: {confirm: '本当に削除してもよろしいですか?'} %>
      <% end %>
    <% end %>



  </div>
</div>
### Gemfile

source 'https://rubygems.org'

git_source(:github) do |repo_name|
  repo_name = "#{repo_name}/#{repo_name}" unless repo_name.include?("/")
  "https://github.com/#{repo_name}.git"
end


# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 5.1.6'
gem 'bootstrap-sass'
gem 'carrierwave'
gem 'mini_magick'
gem 'rails-i18n'
gem 'jquery-rails'
gem 'will_paginate'
gem 'bootstrap-will_paginate'
gem 'faker'

# Use Puma as the app server
gem 'puma', '~> 3.7'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5.0'
# Use Uglifier as compressor for JavaScript assets
gem 'uglifier', '>= 1.3.0'


# Use CoffeeScript for .coffee assets and views
gem 'coffee-rails', '~> 4.2'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.5'

# Use ActiveModel has_secure_password
gem 'bcrypt', '~> 3.1.7'

group :development, :test do
  # Call 'byebug' anywhere in the code to stop execution and get a debugger console
  gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
  # Adds support for Capybara system testing and selenium driver
  gem 'capybara', '~> 2.13'
  gem 'webdrivers'
  gem 'selenium-webdriver'
  gem 'sqlite3', '1.3.13'
  gem 'rspec-rails', '~> 3.8'
  gem 'factory_bot_rails'
  gem 'spring-commands-rspec'
end

group :test do
  gem 'rails-controller-testing', '1.0.2'
  gem 'guard'
  gem 'guard-rspec', require: false
end


group :development do
  # Access an IRB console on exception pages or by using <%= console %> anywhere in the code.
  gem 'web-console', '>= 3.3.0'
  gem 'listen', '>= 3.0.5', '< 3.2'
  # Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
  gem 'spring'
  gem 'spring-watcher-listen', '~> 2.0.0'
end

group :production do
  gem 'fog'
  gem 'pg', '0.20.0'

end



# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]

試したこと

・Chromeのキャッシュ削除
・ローカルサーバーの再起動
→全て効果なし

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

まだ回答がついていません

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる