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

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

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

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

Q&A

1回答

859閲覧

Railsのユーザー作成で画像を保存したい

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

0クリップ

投稿2020/09/21 15:18

前提・実現したいこと

Railsのユーザー作成で、画像選択がない場合はデフォルトを、画像選択時はその画像を保存と表示させたいです。
ユーザー作成でデフォルト画像を表示させるのは成功したのですが、「画像選択がない場合はデフォルトを、画像選択時はその画像を保存と表示」という分岐の作成で失敗しています。

以下で、ユーザー作成時に画像選択がない場合はデフォルト画像(default_user.jpg)を表示させることはできました。

def create @user = User.new( name: params[:name], email: params[:email], image_name: "default_user.jpg", password: params[:password] ) if @user.save session[:user_id] = @user.id flash[:notice] = "ユーザー登録が完了しました" redirect_to("/users/#{@user.id}") else render("users/new") end end

該当のソースコード

次に画像選択がある場合に、その画像を保存するよう試みました。
想定した動作は、ユーザーを作ってデフォルト画像を紐付け、保存時に画像がある場合は紐付けて画像を保存する流れです。

def create @user = User.new( name: params[:name], email: params[:email], image_name: "default_user.jpg", password: params[:password] ) if @user.save session[:user_id] = @user.id if params[:image] @user.image_name = "#{@user.id}.jpg" image = params[:image] File.binwrite("public/user_images/#{@user.image_name}", image.read) end flash[:notice] = "ユーザー登録が完了しました" redirect_to("/users/#{@user.id}") else render("users/new") end end

しかし上記のコードでは、画像未選択ではこちらのエラーとなり、

Started POST "/users/create" for 172.18.0.1 at 2020-09-21 14:45:56 +0000 Cannot render console from 172.18.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by UsersController#create as HTML Parameters: { "utf8" => "✓", "authenticity_token" => "Lmu+y7NRxLIXkja97i6QR/wU6ItYA4u+HgqNmEUYaeiYCWX2UV180TKyq7YWGLDqLuIykwrNyiR3z+jZE4sQgA==", "name" => "userpic0", "email" => "userpic0@example.com", "password" => "[FILTERED]", "image" => "" }  (2.0ms)  BEGIN ↳ app/controllers/users_controller.rb:47 User Exists (0.9ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = 'userpic0@example.com' LIMIT 1 ↳ app/controllers/users_controller.rb:47 User Create (3.3ms)  INSERT INTO `users` ( `name` ,`email` ,`created_at` ,`updated_at` ,`image_name` ,`password_digest` ) VALUES ( 'userpic0' ,'userpic0@example.com' ,'2020-09-21 14:45:57' ,'2020-09-21 14:45:57' ,'default_user.jpg' ,'$2a$12$WtMedTCJmuBlFWSgMouE/eSDwftI07zj1S/XPAIs9rb.ZOzVlGLee' ) ↳ app/controllers/users_controller.rb:47  (7.2ms)  COMMIT ↳ app/controllers/users_controller.rb:47 Completed 500 Internal Server Error in 509ms (ActiveRecord: 13.4ms) NoMethodError (undefined method `read' for "":String): app/controllers/users_controller.rb:52:in `create'

画像選択時は以下のエラーとなりました。

app/controllers/users_controller.rb:52:in `create' Started POST "/users/create" for 172.18.0.1 at 2020-09-21 14:49:38 +0000 Cannot render console from 172.18.0.1! Allowed networks: 127.0.0.1, ::1, 127.0.0.0/127.255.255.255 Processing by UsersController#create as HTML Parameters: { "utf8" => "✓", "authenticity_token" => "KyejZIQ9RJmkfNiLOlr2AqIJ7wxir5vJgGk/tHzzLChiF3DC8UDq9OVIMl/r+2BYy11Hotn/YKm6a2x9QA1O/w==", "name" => "userpic5", "email" => "userpic5@example.com", "password" => "[FILTERED]", "image" => "Screen Shot 2020-09-20 at 23.13.29.png" }  (0.8ms)  BEGIN ↳ app/controllers/users_controller.rb:47 User Exists (2.6ms)  SELECT 1 AS one FROM `users` WHERE `users`.`email` = 'userpic5@example.com' LIMIT 1 ↳ app/controllers/users_controller.rb:47 User Create (6.8ms)  INSERT INTO `users` ( `name` ,`email` ,`created_at` ,`updated_at` ,`image_name` ,`password_digest` ) VALUES ( 'userpic5' ,'userpic5@example.com' ,'2020-09-21 14:49:38' ,'2020-09-21 14:49:38' ,'default_user.jpg' ,'$2a$12$TuBAkGqk3ebASP39sBiGNO.vld6YNVoATzyfxum53zuqEjAF5Cl8.' ) ↳ app/controllers/users_controller.rb:47  (6.6ms)  COMMIT ↳ app/controllers/users_controller.rb:47 Completed 500 Internal Server Error in 523ms (ActiveRecord: 16.7ms) NoMethodError (undefined method `read' for "Screen Shot 2020-09-20 at 23.13.29.png":String): app/controllers/users_controller.rb:52:in `create'

画像未選択時のエラーは

NoMethodError (undefined method `read' for "":String):

となっていますが、File.binwrite("public/user_images/#{@user.image_name}", image.read)は別メソッドで使用しているので、ディレクトリには問題ないかと思います。

画像選択時のエラーは

NoMethodError (undefined method `read' for "Screen Shot 2020-09-20 at 23.13.29.png":String):

となっていますが、「readメソッドはファイルの中身を取得することができます」とあるので、こちらも問題なさそうに見えます。
(参考:Railsでファイルをアップロードしてpublicディレクトリに保存したあとに表示する

ユーザー登録フォームは以下の通りです。本件には関係ないと思いますが、一応記載しておきます。

<%= form_tag("/users/create") do %> <p>ユーザー名</p> <input name="name" value="<%= @user.name %>"> <p>メールアドレス</p> <input name="email" value="<%= @user.email %>"> <p>パスワード</p> <input type="password" name="password" value="<%= @user.password %>"> <p>画像</p> <input name="image" type="file"> <input type="submit" value="新規登録"> <% end %>

お手数おかけしますが、アドバイスよろしくお願いします。

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

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

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

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

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

guest

回答1

0

投稿2020/09/21 16:12

no1knows

総合スコア3365

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問