###前提・分からないこと
開発環境:Ruby on Rails 5.0.0.1
Ruby(RubyonRails)で食べログのようなレビューサイトを作成しています。
レストランの詳細ページ上で『レビュー登録ボタン』を設置し、モーダル登場でレビュー登録ができるようにしようと考えています。
・『レビュー登録』ができるのは、ログインしているユーザーのみ。
・ページを見れるのは全員可能
(・ログインしていないユーザーがボタンを『レビュー登録ボタン』をクリックしたらログインページへ移動する)
上記、3点を実現するために、どうやってコントローラーを記述しようか迷っています。
###エラーメッセージ
Ruby
1NameError in RestaurantsController#show 2undefined local variable or method `review_params' for #<RestaurantsController:0x007fa261b17938>
##該当するソースコード一覧
Controller
・レストランコントローラー(restaurants_controller.rb)
Ruby
1class RestaurantsController < ApplicationController 2 before_action :review_post, only:[:show] 3・・・ 4 def review_post 5 if logged_in? 6 @review = current_user.reviews.build(review_params) 7 if @review.save 8 flash[:success] = "口コミが投稿されました!" 9 redirect_to root_path 10 else 11 redirect_to root_path 12 end 13 end 14 end 15・・・
View
・レストランビュー
Ruby
1・・・ 2<!-- Modal --> 3<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="z-index: 30000;"> 4 <div class="modal-dialog" role="document"> 5 <div class="modal-content"> 6 <%= form_for(@review) do |f| %> 7 <%= render 'shared/error_messages', object: f.object %> 8 <div class="modal-body"> 9 <div class="title page-form account-form"> 10 <h2>口コミを登録する</h2> 11 <form> 12 <div class="form-group review-form-restaurant"> 13 <h3><%= @restaurant.name %></h3> 14 <%= f.hidden_field :restaurant_id, :value => @restaurant.id %> 15 </div> 16 <div class="form-group"> 17 <label for="exampleInputName">口コミを入力する</label><br /> 18 <%= f.select :rate, {'1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,}, class: "form-control" %> 19 </div> 20 <div class="form-group"> 21 <%= f.text_field :title, class: "form-control", placeholder: "タイトル" %> 22 </div> 23 <div class="form-group"> 24 <%= f.text_area :content, class: "form-control", placeholder: "口コミ内容", rows: "5" %> 25 </div> 26 </form> 27 </div> 28 </div> 29 <div class="modal-footer"> 30 <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button> 31 <%= f.submit "投稿する", class: "btn btn-form btn-modal" %> 32 </div> 33 </div> 34 <% end %> 35 </div> 36</div> 37・・・
###試してみたこと
コントローラーに下記をbefore_actionに加えてみたのですが、やはりエラー発生しました。
(これだと、レストランページに行く時点でユーザーログインが必要であることになってしまいますよね。。)
Ruby
1 def logged_in_user 2 unless logged_in? 3 store_location 4 flash[:danger] = "ログインしてください。" 5 redirect_to login_url 6 end 7 end 8end
###追記分
変更してやってみたのですが、なかなかうまくいきません(涙
ビューは表示されるのですが、f.submitを押しても一切動かないのです!(T_T)
・ビュー
Ruby
1・・・ 2<!-- Modal --> 3<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel" style="z-index: 30000;"> 4 <div class="modal-dialog" role="document"> 5 <div class="modal-content"> 6 <%= form_for(@review) do |f| %> 7 <%= render 'shared/error_messages', object: f.object %> 8 <div class="modal-body"> 9 <div class="title page-form account-form"> 10 <h2>口コミを登録する</h2> 11 <form> 12 <div class="form-group review-form-restaurant"> 13 <h3><%= @restaurant.name %></h3> 14 <%= f.hidden_field :restaurant_id, :value => @restaurant.id %> 15 </div> 16 <div class="form-group"> 17 <label for="exampleInputName">口コミを入力する</label><br /> 18 <%= f.select :rate, {'1' => 1, '2' => 2, '3' => 3, '4' => 4, '5' => 5,}, class: "form-control" %> 19 </div> 20 <div class="form-group"> 21 <%= f.text_field :title, class: "form-control", placeholder: "タイトル" %> 22 </div> 23 <div class="form-group"> 24 <%= f.text_area :content, class: "form-control", placeholder: "口コミ内容", rows: "5" %> 25 </div> 26 </form> 27 </div> 28 </div> 29 <div class="modal-footer"> 30 <button type="button" class="btn btn-default" data-dismiss="modal">閉じる</button> 31 <%= f.submit "投稿する", class: "btn btn-form btn-modal" %> 32 </div> 33 </div> 34 <% end %> 35 </div> 36</div> 37・・・
・コントローラー(restaurant)
Ruby
1class RestaurantsController < ApplicationController 2 before_action :logged_in_user, only: :create 3 4 def show 5 @review = current_user.reviews.build if logged_in? 6 end 7 8 def create 9 @review = current_user.reviews.build(review_params) 10 if @review.save 11 flash[:success] = "口コミが投稿されました!" 12 redirect_to root_path 13 else 14 redirect_to root_path 15 end 16 end 17end 18
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2017/05/10 07:06
2017/05/10 07:19 編集
2017/05/10 07:36
2017/05/10 07:38
2017/05/10 09:26
2017/05/10 10:23
2017/05/10 11:04
2017/05/10 11:46
2017/05/11 01:12