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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1195閲覧

スマートフォンからの投稿でエラー表示となります(rails)

yamady

総合スコア176

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/07/26 11:46

いつも大変お世話になっております。
こちらで発生していたエラーに苦しんでいます。口コミサイトをrailsで開発しているのですが、口コミを投稿する際に発生します。

ローカル環境→ 成功
本番環境(PCブラウザ)→ 成功
本番環境(スマートフォン)→ エラー

今回はスマートフォンからのみのエラーに苦しんでいます。。

Ruby

1app[web.1]: ActionView::Template::Error (First argument in form cannot contain nil or be empty): 2app[web.1]: 40: 3app[web.1]: 41: <div class="space"></div> 4app[web.1]: 42: 5app[web.1]: 43: <%= form_for(@post) do |f| %> 6app[web.1]: 44: <section class="menu-review"> 7app[web.1]: 45: <div class="title"> 8app[web.1]: 46: <div class="container"> 9app[web.1]: app/views/smartphone/reviews/new.html.erb:43:in `_app_views_smartphone_reviews_new_html_erb___1229707472540771907_15716720'

##該当するソースコード

ビュー

Ruby

1 <div class="container"> 2 <%= f.hidden_field :space_id, value: @review.space.id %> 3 <div class="post-rate"> 4 <!-- ここにStar Rateが入ります --> 5 <div class="form-group"> 6 <label for="rate">評価</label> 7 <%= f.select :rate, {'1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,}, class: "form-control" %> 8 </div> 9 </div> 10 <div class="post-contents"> 11 <!-- ここにReview内容が入ります --> 12 <div class="form-group"> 13 <label for="textarea">口コミを入力</label> 14 <%= f.text_area :content, class: "form-control", placeholder: "口コミ内容", rows: "5" %> 15 </div> 16 </div> 17 <div class="post-photo"> 18 <label for="textarea">画像を投稿</label> 19 <%= f.fields_for :review_image do |review_image| %> 20 <%= review_image.file_field :image %> 21 <% end %> 22 </div> 23 <div class="post-btn"> 24 <%= f.submit "投稿する", class: "button-review" %> 25 </div> 26 <% end %> 27 </div> 28 </div>

コントローラー

Ruby

1class ReviewsController < ApplicationController 2 before_action :set_review, only:[:show, :edit, :update, :destroy] 3 4 def create 5 @review = current_user.reviews.create(create_params) 6 if @review.save 7 flash[:success] = "口コミが投稿されました!" 8 redirect_to root_path 9 else 10 flash[:alert] = "口コミの投稿に失敗しました。" 11 redirect_to root_path 12 end 13 end 14 15 def show 16 end 17 18 def update 19 if @review.update_attributes(create_params) 20 flash[:success] = "口コミが更新されました" 21 redirect_to @review 22 else 23 render 'edit' 24 end 25 end 26 27 def new 28 @space = Space.find(params[:id]) 29 if signed_in? 30 @post = current_user.reviews.new 31 @post.build_review_image 32 end 33 end 34 35 def destroy 36 @review.destroy 37 flash[:success] = "口コミが削除されました" 38 redirect_to request.referrer || root_url 39 end 40 41 def edit 42 end 43 44 private 45 46 def set_review 47 @review = Review.find(params[:id]) 48 end 49 50 def create_params 51 params.require(:review).permit(:id, :content, :rate, :title, :space_id, :user_id, review_image_attributes: [:image]) 52 end 53 54 def correct_user 55 @review = current_user.reviews.find_by(id: params[:id]) 56 redirect_to root_url if @review.nil? 57 end 58end 59

##試してみたこと

「First argument in form cannot contain nil or be empty」こちらのエラーをググってみました。
すると、teratailさんで同様のエラーに苦しんでいる方を見つけまして。
https://teratail.com/questions/16823

そこで、もともとコントローラーでbuild記述していたところをnewに変更しました。

変更前

ruby

1 if signed_in? 2 @post = current_user.reviews.build 3 @post.build_review_image 4 end

変更後

ruby

1 if signed_in? 2 @post = current_user.reviews.new 3 @post.build_review_image 4 end

しかし、変わらずエラーとなってしまいました。
すみませんが、どなたかご教示していただけませんでしょうか。

同じエラーで申し訳ございません。

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

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

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

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

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

guest

回答1

0

ベストアンサー

signed_in?が真にならず、@post = current_user.reviews.newが呼ばれないので@postが空のままなんではないでしょうか。(なお、newでもいいのですが、普通はbuild使うのでそうした方がいいです)

なぜsigned_in?が真にならないかは呈示されている状態だけでは判断できません。単純にはログイン操作してないということになります。

ただ、呈示されているコードの内容では、ログインして操作して動けばよい、という状態ではないように見受けられます。

ログイン状態のチェックがないか不完全なので、newcreateは質問のようにプログラムの実行を停止させるエラーとなります。また、ログイン状態にかかわらず、任意のReviewが更新、削除可能です。おそらくこれは致命的な脆弱性です。チェックコードらしきものがあるのですが呼ばれてませんし、これもログインしてない状態だとエラーになります。

一旦立ち止まって、コードの意味と動きをきちんと理解できるようになってから先に進んだ方がいいように思います。

投稿2017/07/26 13:57

suzukis

総合スコア1449

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

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

yamady

2017/07/27 06:39

suzukisさまがおっしゃる通りですね。このような質問にもご対応いただきありがとうございます。まともに勉強をしてこなかったツケがいま、ガンガンきています。。苦笑 とりあえず、ドットインストールとかですかね・・・。勉強しなおしたいと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問