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

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

新規登録して質問してみよう
ただいま回答率
85.49%
Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

1回答

291閲覧

画像投稿時のエラーの解消

whiteN

総合スコア7

Cloud9

Cloud9は、クラウドからのプログラミングが可能になるWebサービス。IDEとしての機能が搭載されており、GitHubやHerokuなど他ツールとの連携も可能です。ブラウザ上で動くため、デバイスに関係なく開発環境を準備できます。

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Ruby on Rails

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2018/01/31 10:28

前提・実現したいこと

Cloud9を用いてRuby on railsでのWebアプリケーション制作を学んでいます。

画像投稿画面(send_pictures.html.erb)から画像を投稿した後、詳細画面(detail_request.html.erb)に戻り投稿した画像が表示されているという形にしようとしています。
投稿画面で画像を選択し送信ボタンを押すと、以下のようなエラーが出てしまい
色々試してみましたが解決方法が見つからず困っています。
解決方法をどなたか教えてください。よろしくお願いします。

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

エラーメッセージは以下の通りです。

NoMethodError in RequestsController#upload undefined method `date' for nil:NilClass FileUtils.mkdir_p("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}") unless FileTest.exist?("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}")

該当のソースコード

画像投稿画面(send_pictures.html.erb)

html

1<h4><%= @request.date %></h4> 2 3<%= form_tag("/requests/upload", {multipart: true}) do %> 4 <input type = "file" name = "pic1"> 5 <input class="button_signup" type="submit" value="送信"> 6<% end %>

詳細画面(detail_request.html.erb)

html

1<h4><%= @request.date %></h4> 2 3<% if @request.pic1 != nil %> 4 <% 5.times do |num| %> 5  <img src="<%= "/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}/#{@request.date}_#{num+1}.jpg" %>" width=20%> 6 <% end %> 7<% end %> 8<br> 9 10<%= link_to("画像送信", "/requests/upload/#{@request.id}") %>

requests_controller.rb

ruby

1class RequestsController < ApplicationController 2 def detail_request 3 @request = Request.find_by(id: params[:id]) 4 end 5 6 def send_pictures 7 @request = Request.find_by(id: params[:id]) 8 end 9 10 def upload 11 @request = Request.find_by(id: params[:id]) 12 13 FileUtils.mkdir_p("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}") unless FileTest.exist?("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}") 14 15 if params[:pic1] 16 @request.pic1 = "#{@request.date}_1.jpg" 17 pic1 = params[:pic1] 18 File.binwrite("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}/#{@request.pic1}", pic1.read) 19 end 20 21 if @request.save 22 flash[:notice] = "画像を登録しました" 23 redirect_to("/requests/detail/#{@request.id}") 24 else 25 render("requests/send_picture") 26 end 27 end 28 29end

routes.rb

ruby

1Rails.application.routes.draw do 2 get 'requests/detail/:id' => 'requests#detail_request' 3 get 'requests/upload/:id' => 'requests#send_pictures' 4 post 'requests/upload' => 'requests#upload' 5end

試したこと

  1. 画像投稿画面に@request.dateを表示させてみたが、問題なく表示されていた。
  2. 保存先のフォルダ名を@request.idに変えてみたが

"undefined method `id' for nil:NilClass"
とエラーの対象が変わるだけでエラー内容は変わらなかった。

補足情報(FW/ツールのバージョンなど)

Rails 5.1.4

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

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

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

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

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

guest

回答1

0

ベストアンサー

form_tag("/requests/upload", {multipart: true})
の指定パスが違っていて、idが渡せていないんじゃないでしょうか?

正しいパスはroutes.rbの記載内容に合わせてだと思いますが、@requestのidを入れる必要があるかと。

以下でデバッグしてみては?

ruby

1def upload 2 @request = Request.find_by(id: params[:id]) 3 4 # 以下を追加 5 p @request 6 p params[:id] 7 8 FileUtils.mkdir_p("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}") unless FileTest.exist?("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}") 9 10 if params[:pic1] 11 @request.pic1 = "#{@request.date}_1.jpg" 12 pic1 = params[:pic1] 13 File.binwrite("public/pictures/#{@request.date.year}/#{@request.date.month}/#{@request.date.day}/#{@request.pic1}", pic1.read) 14 end 15 16 if @request.save 17 flash[:notice] = "画像を登録しました" 18 redirect_to("/requests/detail/#{@request.id}") 19 else 20 render("requests/send_picture") 21 end 22 end 23 24end

追記

ruby

1Rails.application.routes.draw do 2 get 'requests/detail/:id' => 'requests#detail_request' 3 get 'requests/upload/:id' => 'requests#send_pictures' 4 # 以下に修正 5 post 'requests/upload/:id' => 'requests#upload' 6end

html

1<!-- form_tagのpath変更 --> 2<%= form_tag("/requests/upload/#{@request.id}", {multipart: true}) do %> 3 <input type = "file" name = "pic1"> 4 <input class="button_signup" type="submit" value="送信"> 5<% end %>

投稿2018/02/01 03:21

編集2018/02/01 10:59
h_daido

総合スコア824

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

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

whiteN

2018/02/01 06:36

ご教示いただきありがとうございます。 パスの確認を行いましたが、間違っていませんでした。 また、追加してデバッグしてみましたが、エラーの場所にもないようにも変わりがありませんでした。
h_daido

2018/02/01 07:00 編集

本当ですか???この記述方式だと間違いなくparams[:id]の値は渡せていないはずですが...。ちなみにエラー自体は変わらないはずですし、p xxx の部分は今まで表示されているデバッグログとは違う場所にでますよ。 ターミナルなどで > rails server した画面に表示されます。 もしわかりづらければ、 p '================================' p @request p params[:id] とかってやっておくと表示箇所がわかりやすくなると思います。
whiteN

2018/02/01 09:19

本当です。 上記と変わらないエラーが表示されてしまい、画像の投稿ができません。
h_daido

2018/02/01 11:01

いや...そりゃそうですよ。上記はデバッグするためのコードで、修正するためのコードじゃないでしょ? 本当にちゃんとログ見ました?標準出力されているものが、 ================================ nil nil となっていませんでしたか? そこまで分かれば修正ポイントもわかりそうなものですが、一応追記していおいたのでよかったら見てみてください。
whiteN

2018/02/02 02:18

ご教示ありがとうございます。 デバッグのためのコードというものを理解できていませんでした。 勉強不足で申し訳ありません。 追記いただいた内容でエラー表示が消え、画像の投稿ができました。ありがとうございました。
h_daido

2018/02/02 03:04

いえ、わかっていただけたならよかったです。 ちなみに、routingの設計がrailsの標準に則していない気がします。別にこのままでも動作はするのですが、あまり見ないroutingなので、一度 https://railsguides.jp/routing.html とか確認されるとよいかと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問