前提・実現したいこと
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"[0;37m => [0m[0;33m"✓"[0m, "authenticity_token"[0;37m => [0m[0;33m"Lmu+y7NRxLIXkja97i6QR/wU6ItYA4u+HgqNmEUYaeiYCWX2UV180TKyq7YWGLDqLuIykwrNyiR3z+jZE4sQgA=="[0m, "name"[0;37m => [0m[0;33m"userpic0"[0m, "email"[0;37m => [0m[0;33m"userpic0@example.com"[0m, "password"[0;37m => [0m[0;33m"[FILTERED]"[0m, "image"[0;37m => [0m[0;33m""[0m } [1m[35m (2.0ms)[0m [1m[35m BEGIN[0m ↳ app/controllers/users_controller.rb:47 [1m[36mUser Exists (0.9ms)[0m [1m[34m SELECT 1 AS one FROM `users` WHERE `users`.`email` = 'userpic0@example.com' LIMIT 1[0m ↳ app/controllers/users_controller.rb:47 [1m[36mUser Create (3.3ms)[0m [1m[32m 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' )[0m ↳ app/controllers/users_controller.rb:47 [1m[35m (7.2ms)[0m [1m[35m COMMIT[0m ↳ 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"[0;37m => [0m[0;33m"✓"[0m, "authenticity_token"[0;37m => [0m[0;33m"KyejZIQ9RJmkfNiLOlr2AqIJ7wxir5vJgGk/tHzzLChiF3DC8UDq9OVIMl/r+2BYy11Hotn/YKm6a2x9QA1O/w=="[0m, "name"[0;37m => [0m[0;33m"userpic5"[0m, "email"[0;37m => [0m[0;33m"userpic5@example.com"[0m, "password"[0;37m => [0m[0;33m"[FILTERED]"[0m, "image"[0;37m => [0m[0;33m"Screen Shot 2020-09-20 at 23.13.29.png"[0m } [1m[35m (0.8ms)[0m [1m[35m BEGIN[0m ↳ app/controllers/users_controller.rb:47 [1m[36mUser Exists (2.6ms)[0m [1m[34m SELECT 1 AS one FROM `users` WHERE `users`.`email` = 'userpic5@example.com' LIMIT 1[0m ↳ app/controllers/users_controller.rb:47 [1m[36mUser Create (6.8ms)[0m [1m[32m 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.' )[0m ↳ app/controllers/users_controller.rb:47 [1m[35m (6.6ms)[0m [1m[35m COMMIT[0m ↳ 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 %>
お手数おかけしますが、アドバイスよろしくお願いします。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。