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

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

新規登録して質問してみよう
ただいま回答率
87.20%
Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

解決済

Railsで画像が保存されない問題の解決方法を探しています(carrierwave及びminimagickを使用)

pontarou3
pontarou3

総合スコア18

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

1回答

1評価

1クリップ

3826閲覧

投稿2020/03/12 10:20

編集2020/03/13 07:58

#【現在の状況】Railsで画像添付機能付きミニ掲示板アプリケーションを作成しています。

準備段階としてgemにて
carrierwave
minimagick

を用意。bundle install済みです。

#【解決したいこと】画像の投稿だけDBに保存されません

できる◯
タイトル、コンテンツの投稿

できない×
画像の投稿
title、contentと画像の投稿

(バリデーションは現在かけていません)

#paramsのメッセージについて

42: private 43: 44: def post_params 45: params.require(:post).permit(:title, :content, images_attributes: [:src]).merge(user_id: current_user.id) 46: byebug => 47: end 48: 49: def set_post 50: @post = Post.find(params[:id]) 51: end (byebug) params <ActionController::Parameters {"utf8"=>"✓", "authenticity_token"=>"avP5DeA8ZSPhaUMkOvPmvW1rF7ML5bptV+cb6PMs3O5pcsBXzvHZtTVzWo0iWPC5crB/actaEN/AquKCzZY9ZA==", "post"=><ActionController::Parameters {"images_attributes"=>{"0"=>{"src"=>#<ActionDispatch::Http::UploadedFile:0x00007ff3b20f7438 @tempfile=#<Tempfile:/var/folders/ww/kfxy7w0565x8jj51gtp67gmr0000gn/T/RackMultipart20200312-43216-1o11cr3.png>, @original_filename="スクリーンショット 2020-03-04 16.04.20.png", @content_type="image/png", @headers="Content-Disposition: form-data; name=\"post[images_attributes][0][src]\"; filename=\"\xE3\x82\xB9\xE3\x82\xAF\xE3\x83\xAA\xE3\x83\xBC\xE3\x83\xB3\xE3\x82\xB7\xE3\x83\xA7\xE3\x83\x83\xE3\x83\x88 2020-03-04 16.04.20.png\"\r\nContent-Type: image/png\r\n">}}, "title"=>"1234", "content"=>"5677"} permitted: false>, "commit"=>"Save", "controller"=>"posts", "action"=>"create"} permitted: false>

paramsまではデータが運ばれていると思いました。

#現状の疑わしい点の整理

①paramsの値が返ってこないcreateアクションが怪しい・・・

 ・createアクションがimageのデータを読み込まれてない?

②アソシエーションの問題かも??
・postしたときに画像も保存するようになってるだろうか?

#【調べたこと・試したこと】
細かいところをいじったり、参考にしたりと、かなり色々試したのですが、
以下が怪しいと思いましたので記載します。

byebugで値がとれているのか否か?? を調べました。

①createアクションは反応ないので(ここが怪しい・・・・と思いました)

controller

def create @post = Post.new(post_params) byebug ↑上記反応なし if @post.save redirect_to root_path, notice: "投稿しました" else flash[:alert] = "入力してください" render :new end end

paramsでbyebugしてみると

controller

def post_params params.require(:post).permit(:title, :content, images_attributes: [:src]).merge(user_id: current_user.id) byebug end

↑この記述では、paramsの値が返ってきました(上記paramsのメッセージについてに記載済み)

#各ファイルのデータについて

①モデル

user.rb

user

class User < ApplicationRecord devise :database_authenticatable, :registerable, :recoverable, :rememberable, :validatable has_many :posts end

post.rb

post

class Post < ApplicationRecord has_many :images belongs_to :user accepts_nested_attributes_for :images end

image.rb

image

class Image < ApplicationRecord mount_uploader :src, ImageUploader belongs_to :posts end

image_uploader.rb

class ImageUploader < CarrierWave::Uploader::Base # Include RMagick or MiniMagick support: # include CarrierWave::RMagick include CarrierWave::MiniMagick # Choose what kind of storage to use for this uploader: storage :file # storage :fog # 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('_')) # # "/images/fallback/" + [version_name, "default.png"].compact.join('_') # end # Process files as they are uploaded: # process scale: [200, 300] # # def scale(width, height) # # do something # 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 # Override the filename of the uploaded files: # Avoid using model.id or version_name here, see uploader/store.rb for details. # def filename # "something.jpg" if original_filename # end process resize_to_fit: [100, 100] end

②view
_post.html.erb

<%# コメント&画像投稿エリア %> <div class="album py-5 bg-light"> <div class="container"> <div class="row"> <% @posts.each do |post| %> <div class="col-md-4"> <div class="card mb-4 shadow-sm"> <!-- 画像投稿フォーム ここから --> <% post.images.each do |image| %> <%= image_tag image.src.url %> <% end %> <!-- 画像投稿フォーム ここまで --> <div class="card-body"> <p class="card-text"><%= post.content %></p> <div class="d-flex justify-content-between align-items-center"> <div class="btn-group justify-content-center"> <button type="button" class="btn btn-sm btn-outline-secondary"><%= post.title %></button> <div class="field"> <%= post.user.nickname %><br>様の投稿 </div> <button type="button" class="btn btn-sm btn-outline-secondary">いいね♡</button> </div> </div> <small class="text-muted"><%= l post.created_at %></small> <button type="button" class="btn btn-sm"><%= post.id %>回目の投稿</button> <% if user_signed_in? %> <%= link_to "編集", edit_post_path(post), class: 'btn btn-primary my-2' %> <% else %> <%= "" %> <% end %> </div> </div> </div> <% end %> </div> </div> </div>

new.html.erb

<div> <div class = "col-md-4 offset-md-4"> <h2 class = "text-center">new post</h2> <%= render partial: "form" %> </div> <div class = "col-md-4 offset-4"> <%= link_to 'トップ', root_path %> </div> </div>

index.html.erb

<%= render partial: "devise/shared/header" %> <%# 会員登録、ログイン%> <main role="main"> <section class="jumbotron text-center"> <div class="container"> <h3>ワンペタノート</h3> <p class="lead text-muted">画像も投稿できる掲示板です</p> <p> <% if user_signed_in? %> <%= link_to "新規投稿", new_post_path, class: 'btn btn-primary my-2' %> <%= link_to "ログアウト", destroy_user_session_path, method: :delete, class: 'btn btn-primary my-2' %> <% else %> <%= link_to "新規登録", new_user_registration_path, class: 'btn btn-primary my-2' %> <%= link_to "ログイン", new_user_session_path, class: 'btn btn-primary my-2' %> <% end %> </p> </div> </section> <%= render partial: 'post', collection: @posts %> <%= render :partial => "devise/shared/footer" %>

③コントローラー
post_controller.rb

controller

class PostsController < ApplicationController before_action :set_post, except: [:index, :new, :create] def index @posts = Post.includes(:user, :images).all.order('created_at DESC') end def show @post = Post.find(params[:id]) end def new @post = Post.new @post.images.new end def create @post = Post.new(post_params) if @post.save redirect_to root_path, notice: "投稿しました" else flash[:alert] = "入力してください" render :new end end def edit @post = Post.find(params[:id]) end def update @post = Post.find(params[:id]) if @post.update(post_params) redirect_to root_path, notice: "success" else flash[:alert] = "save error" render :edit end end private def post_params params.require(:post).permit(:title, :content, images_attributes: [:src]).merge(user_id: current_user.id) end def set_post @post = Post.find(params[:id]) end end

#ER図は以下のように考えてます。

余計な情報かもしれませんが・・・おかしな点がございましたらご指摘いただけますと幸いです。
イメージ説明

#参考にさせていただいた記事
carrierwaveを利用して画像をアップロードしたがDBに保存されない
Rails4 で form_for が multipart にならない

【メモ】Strong Parametersの概要と配列データの扱い方について
paramsを用いた投稿画面の作成と保存

[学習用]Rails5:CarrierWaveで画像投稿+rmagickでサムネイル保存+画像名ランダム化

以上となります。
長くなってしまい申し訳ございません。

最後までみていただき、ありがとうございます。

良い質問の評価を上げる

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

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

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

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

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

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

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

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

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

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

会員登録して回答してみよう

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

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。