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

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

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

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

Ruby on Rails

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

Q&A

解決済

1回答

1601閲覧

ユーザーのみができるコメント登録に苦戦しています。(rails)

yamady

総合スコア176

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2017/05/10 02:18

編集2017/05/10 07:36

###前提・分からないこと

開発環境: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

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

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

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

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

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

guest

回答1

0

ベストアンサー

こういう場合は
登録(多分create)にbefore_actionで
logged_in_userを設定します。
また、
unless logged_in?
を使って、viewの投稿フォームを消すまたは編集不能にすることで
(ログインしてくださいと表示とかもいいかも)
書いて、登録しようとしたら、「ログインしてください。」が出て
消えてしまったみたいなことも、防げていいと思います。

ruby

1 def logged_in_user 2 unless logged_in? 3 store_location 4 flash[:danger] = "ログインしてください。" 5 redirect_to login_url 6 else 7 true 8 end 9 end 10end

投稿2017/05/10 04:52

編集2017/05/10 07:17
moke

総合スコア2241

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

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

yamady

2017/05/10 07:06

mokeさま、いつもありがとうございます。的確な対応、感謝いたします。 理解が追いついておらず、追記したようなコードでやったのですが、ボタンを押してもなかなか動く様子がありません(涙)
moke

2017/05/10 07:19 編集

Railsのversionは基本的に書いてください。 versionによっては、logged_in_userがtrueを返した時だけ、createに行く可能性があります。
yamady

2017/05/10 07:36

大変失礼いたしました。 開発環境はRuby on Rails 5.0.0.1となります。
moke

2017/05/10 07:38

一応、ログインしていればtrueを返すようにlogged_in_user変更しておきました 大したことはしていませんが、これで試してどうですか? def logged_in_user unless logged_in? store_location flash[:danger] = "ログインしてください。" redirect_to login_url else true end end end
yamady

2017/05/10 09:26

コメントありがとうございます。 ボタンを押してもエラーすらでない状態なので、フロントの方に問題があるかもしれません。 こちら、再度見直してみます。 本当にありがとうございます
moke

2017/05/10 10:23

debbugはしていますか? debbug環境が整えなくても、知りたい値や成功っといったメッセージを puts するようにすれば簡易debbugが可能です。
yamady

2017/05/10 11:04

ありがとうございます。 下記の順番を逆にしたら、できました!ありがとうございます! <div class="modal-content"> <%= form_for(@review) do |f| %>
moke

2017/05/10 11:46

よかったです。 そこは気づかなかった
yamady

2017/05/11 01:12

細かいところでした( 本当にいろいろと助かりました^^
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問