🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

Q&A

1回答

2327閲覧

【rails】publicディレクトリに画像データを保存したい

29taku

総合スコア5

Ruby on Rails

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

データベース

データベースとは、データの集合体を指します。また、そのデータの集合体の共用を可能にするシステムの意味を含めます

保存

保存(save)とは、特定のファイルを、ハードディスク等の外部記憶装置に記録する行為を指します。

0グッド

0クリップ

投稿2021/02/16 07:46

ruby on rails にて簡易的なツイートアプリ作成中です。

画像付きの投稿ができる機能を作りたいのですが、DBへの画像名の保存及びpublicディレクトリ内への画像データの保存がうまくいきません。

具体的にやりたいことは

・画像ファイル名はテーブルのimageカラムへ保存(テーブルにimageカラムはstring型で作成済み)
・画像データは/public/tweet_imageへ保存

の2点です。

下記がコードになります。

ruby

1class TweetsController < ApplicationController 2 3 def index 4 @tweets = Tweet.includes(:user).order("id DESC") 5 end 6 7 def new 8 end 9 10 def create 11 Tweet.create( 12 title: tweet_params[:title], 13 text: tweet_params[:text], 14 user_id: 1) 15 if tweet_params[:image] 16 Tweet.create(image: tweet_params[:image]) 17 image = tweet_params[:image] 18 File.binwrite("public/tweet_images/#{image}", image.read) 19 end 20 end 21 22 private 23 def tweet_params 24 params.permit(:title, :image, :text) 25 end 26end

ruby

1<div class="contents row"> 2 <div class="container"> 3 <%= form_tag('/tweets', {multipart: true}) do %> 4 <h3> 5 POST 6 </h3> 7 <input name="title" placeholder="title"> 8 <input name="image" type="file" placeholder="image"> 9 <textarea name="text" placeholder="text" rows="10" cols="30"></textarea> 10 <input type="submit" value="SEND"> 11 <% end %> 12 </div> 13</div>

上記のコードで投稿画面からデータを入力し送信すると下記のエラーが表示されます。

イメージ説明

おそらくparams[:image]に画像データが含まれていないのではないかと考えておりますが、現時点で解決方法が見つかっておりません。どなたかご教示いただけますと幸いです。

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2021/02/16 07:55

type="file" placeholder ここ、全角空白のようですが、問題ないですか? 自前で書くよりフォームヘルパー使ったほうが良いですよ。
29taku

2021/02/16 08:05

ご指摘ありがとうございます! 全角空白の部分は修正しましたが、特に動作に変化は起きていません。 フォームヘルパーに関してはまだ取り組んだことがなかったため調べてみます。
m.ts10806

2021/02/16 08:22

あとは、デバッグして各パラメータ調べてください。
m.ts10806

2021/02/16 08:23

そういえばform_tagは非推奨機能だったような。
guest

回答1

0

いくつか問題があります。

  1. まず質問の問題が解決しても期待するレコードは作られません。

imageのないTweetとimageだけのTweetの2つが出来てしまいます。

  1. 別のtweetで同じ名前のfileが添付されると、上書きされてしまいます。
  2. imageの使い方が混乱File.binwrite("public/tweet_images/#{image}", image.read) ひとつ目はStringを期待し、2つめはIOを期待している。
  3. 非推奨になった form_tagを使っていて、にもかかわらず 入力fieldがrailsのhelperを使っていない、、、(これは致命的ではないですが、他のRailsマンが読みにくいなどなどが)

で、
エラーの出方を見るとparams[:image]がマルチパートで渡ってきていない様にも見えます。logでParametersを確認してください。

投稿2021/02/16 12:44

winterboum

総合スコア23567

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

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

アカウントをお持ちの方は

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問