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

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

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

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

Flash

Flashは、Webページにアニメーション、ビデオ、また対話型のアプリケーションを埋め込むためにAdobe社が提供しているクロスプラットフォームのインターネットマルチメディアランタイムです。

Ruby

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

Ruby on Rails

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

Q&A

解決済

1回答

2206閲覧

画像がnilのまま投稿するとエラーになる

jqk

総合スコア26

Cloud9

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

Flash

Flashは、Webページにアニメーション、ビデオ、また対話型のアプリケーションを埋め込むためにAdobe社が提供しているクロスプラットフォームのインターネットマルチメディアランタイムです。

Ruby

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

Ruby on Rails

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

Amazon S3

Amazon S3 (Simple Storage Service)とはアマゾン・ウェブ・サービスが提供するオンラインストレージサービスです。

0グッド

0クリップ

投稿2020/02/13 05:36

編集2020/02/13 11:58

題名の通り、画像を空のまま投稿するとエラーが返ってきます。
Micropostモデルのimgカラムの中身がnilのまま投稿したら、
root_pathに飛んでflashを表示させたいのですがどうしたら良いのでしょうか。
ご教授よろしく御願い致します。
エラー内容
micropostモデルの中で下記実装中です。

validates :img, presence:true

[試したこと]
MicropostsControllerのcreateアクションの中で下記コードを実装済。
redirect_to root_path if micropost_params == nil(3行目)

def create @micropost = current_user.microposts.build(micropost_params) redirect_to root_path if micropost_params == nil if @micropost.save flash[:success] = "投稿しました!" redirect_back(fallback_location: root_path) else flash[:danger] = "投稿に失敗しました!" @feed_items = current_user.feed.paginate(page: params[:page]) render 'pages/home' end end private def micropost_params params.require(:micropost).permit(:img) end
[viewファイル] <h4 class="modal-title">写真投稿</h4> <div class="modal-body"> <% @micropost = Micropost.new unless @micropost %> <%= form_for(@micropost) do |f| %> <%= f.file_field :img, accept: 'image/jpeg,image/gif,image/png' %> <%= f.submit "投稿する", class: 'btn btn-primary' %> <% end %> </div>

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

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

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

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

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

siruku6

2020/02/13 11:49 編集

投稿formのviewファイルを質問内に追記していただいてもいいでしょうか? errorを見る限りでは、paramsの中にmicropostというkeyが存在しないせいでエラーになっているように見えます。
jqk

2020/02/13 11:59

返信ありがとうございます。viewfile追加しました。 因みに、画像を添付すれば、画像投稿はできます。
guest

回答1

0

ベストアンサー

原因の調査結果

viewファイルを真似たところ、動作を再現することができました。
f.file_fieldについては、中身が入力されていない場合、その枠(今回でいうところの micropost)もない状態で処理がcontrollerに移るようです。

その結果、requireに失敗してしまいます。

ところが、text_fieldなどであれば、入力値が空であったとしても枠(今回はmicropost)が存在する状態で処理が行われるので、今回のようなエラーにはなりません。

つまり、file_field特有のバグのようです。

対策

ここで、対策としてfile_field以外の入力フォームを追加することでこの問題は回避できるのですが、micropostにはimg以外のカラムは存在しないのでしょうか??

他のカラムがあれば、その入力フォームをviewに追加すれば、requireに失敗するerrorは回避できそうです。

もしカラムがもう何もないようであれば、特に存在意義はないのですが、次のようなコードをviewに差し込んでおくことで、micropostの枠が生成されてrequireは成功するようになると思いますので試してみてください。

view

1# これはだめだった(20200214判明) 2= f.hidden_field :id 3 4# こっちはどうでしょう? 5= f.hidden_field :user_id, value: current_user.id

補足(以下、間違いでした)

今回は次のようなvalidationを設定していると思いますので、

model

1validates :img, presence: true

次の1行は削除してもらって大丈夫だと思います。

controller

1redirect_to root_path if micropost_params == nil

これがなくても、次の条件が自動でfalseになるのでelse文の処理に入ります。

controller

1if @micropost.save

投稿2020/02/13 15:10

編集2020/02/14 02:37
siruku6

総合スコア1382

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

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

siruku6

2020/02/13 15:24

すみません、rootに遷移させたいのであれば、redirect_toは要りますね。 通常そんなことはしないので見落としてしまっていました。
jqk

2020/02/13 15:56

丁寧なご説明ありがとうございます!言われた通りに<%= f.hidden_field :id %>をviewに挿入するとimgがnilの時のエラー表示が無くなりました! ですが逆に、imgに画像を挿入して、投稿をしたところ、別のエラーが発生する様になりました。 → No route matches [GET] "/microposts" micropostモデルのカラムはimgとuser_idだけです。 どうしてこの様なエラーが表示されてしまうのでしょうか?宜しければご教授御願い致します。
siruku6

2020/02/14 02:31

困りました、、、idカラムを仮で追加しても、どうせpermit(:img)をすり抜けられないから問題ないと思っていたのですが、そう簡単には行かないみたいですね。 エラーの理由としては、書かれているとおりで、micropostテーブルが想定していない情報(:id)が与えられたためだと考えられます。 user_idならあるということなので、実際に存在するデータを渡すことにして、 = f.hidden_field :user_id, value: current_user.id に変更すると、新しいエラーも回避できるかもしれません。
jqk

2020/02/14 02:56

<%= f.hidden_field :user_id, value: current_user.id%>に変えても同じエラーが表示されてしまします。  → No route matches [GET] "/microposts" ご丁寧な対応ありがとうございます!もう一度試行錯誤してみます! 解決次第追加で情報流します!
siruku6

2020/02/14 02:58

user_idは実際に存在するカラムなので、permit対象に追加してみるとどうでしょうか?(今は:imgだけのようですが)
siruku6

2020/02/14 03:02

あ、勘違いしてました。 これ全部エラー文だと思ってましたが、後半はShunPさんの説明文でしたか、、、 >No route matches [GET] "/microposts" micropostモデルのカラムはimgとuser_idだけです。 そういうことであれば、routingエラーが発生しているようなので、routingエラーの全文と、rails routes コマンドの結果を見比べてみてください。 分からなければ両方を掲載してもらえれば私か他の誰かが回答出来ると思います。 頑張ってみてください~
jqk

2020/02/14 04:32 編集

siruku6さん解決しました!!本当にケアしていただき有難う御座います!! [解決方法] ①言われた通りにviewに<%= f.hidden_field :user_id, value: current_user.id%>を追加。 次にidが定義されていないというエラー文が表示されたので、 viewに<% if user_signed_in? %>を追加(deviseを使用している為)。 ②次に、No route matches [GET] "/microposts"というエラーが表示されたので、 MicropostsControllerのcreateアクションのリダイレクト先を変更。 redirect_back(fallback_location: root_path)→→redirect_to root_path ストロングパラメータで許可するのは、imgカラムだけでも大丈夫です。 因みにredirect_to root_pathに変えた理由は、ただの勘です。 どうしてこれでエラーが表示されなくなったのか、分かる範囲で良いので、 ご教授頂きたいです。よろしく御願い致します。
siruku6

2020/02/17 10:39 編集

実は、私も`redirect_back(fallback_location: パス)`という記述を見るのは初めてで、ここは理解できていません。 調べてみると、どうやらつい最近追加されたばかりのメソッドのようです(日本語の記事が少ない そして、このメソッドの機能としては、直前に開いていたページにリダイレクトさせることのようです。 これはあくまでも予想なのですが、もしかしたら redirect_back() は直前に開いていたページに強制的に 「get リクエスト」で飛ばそうとするのかもしれません。 そしてその遷移先が、「実は get 以外の postなどのrequestで表示されていたページ」だった場合、routingが存在しないためにエラーになってしまいます。 この説明でなんとなくイメージできればいいなと思っています。。。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問