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

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

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

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

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

Q&A

1回答

396閲覧

rails コメント機能

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails 5

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

Devise

Deviseとは、Ruby-on-Railsの認証機能を追加するプラグインです。

0グッド

0クリップ

投稿2020/09/19 23:58

railsアプリケーションを作っていて、画像をアップロードする機能を作っていて
投稿するboardモデル、コメントをするcommentモデル、ログインするuserモデルがあります(devise)
ログインしている人のみコメントを投稿するようにしたいのですが以下の写真の通りcontroller内の記述が間違っているせいかうまく機能しません。
どこが間違えているのかがわからないためもしわかる方がいればアドバイスいただければ幸いです。。モデルの関連などはできていると思います。
宜しくお願いします
イメージ説明

【boards.controller】

board.controller.rb

1class BoardsController < ApplicationController 2 before_action :authenticate_user! 3 before_action :set_target_board, only: %i[show edit update destroy] 4 5 def index 6 @boards = Board.all 7 end 8 9 def new 10 @board = Board.new(flash[:board] 11 ) 12 end 13 14 def create 15 @board = current_user.boards.new(board_params) 16 17 if @board.save 18 flash[:notice] = "「#{@board.title}」の掲示板を作成しました" 19 redirect_to root_path 20 else 21 redirect_to :back, flash: { 22 board: @board, 23 error_messages: board.errors.full_messages 24 } 25 end 26 end 27 28 def show 29 @comments = @board.comments 30 @comment = current_user.comments.new 31 end 32 33 def edit 34 end 35 36 def update 37 if @board.update(board_params) 38 redirect_to @board 39 else 40 redirect_to :back, flash: { 41 board: @board, 42 error_messages: @board.errors.full_messages 43 } 44 end 45 end 46 47 def destroy 48 @board.delete 49 redirect_to boards_path, flash: { notice: "「#{@board.name}」の掲示板が削除されました" } 50 end 51 52 private 53 54 def board_params 55 params.require(:board).permit(:name, :image, :body) 56 57 end 58 59 60 61 def set_target_board 62 @board = Board.find(params[:id]) 63 end 64end

【comments.controller】

class CommentsController < ApplicationController def create @comment = current_user.comments.new(comment_params) if @comment.save flash[:notice] = "コメントを投稿しました" redirect_to root_path else flash[:error_messages]= @comment.errors.full_messages redirect_back root_path end end def destroy comment = Comment.find(params[:id]) comment.delete redirect_to comment.board, flash: {notice: "コメントが削除されました"} end private def comment_params params.require(:comment).permit(:board_id, :name, :comment) end end

【パーシャル】

<%= render partial: "shared/error_messages"%> <div class="p-comment__formBox"> <p class="p-comment__formTitle">コメント投稿欄</p> <%= form_with (model: [@comment,@board], local:true) do |f| %> <%= f.hidden_field :board_id %> <div class="form-group"> <%= f.label :name, '名前' %> <%= f.text_field :name, class: 'form-control' %> </div> <div class="form-group"> <%= f.label :comment, 'コメント' %> <%= f.text_area :comment, class: 'form-control', rows: 4 %> </div> <%= f.submit '送信', class: 'btn btn-primary' %> <% end %> </div>

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

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

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

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

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

guest

回答1

0

パーシャルはCommentsControllerから呼んでますかBoardsControllerから呼んでますか。

全体を通して問題があるのは インスタンス変数を未定義で使ってます。
パーシャルで [@comment,@board] と使われていますが、どちらのcontrollerの new, edit でも両方を定義されているものがありません。
またcontrllerのmethodの中で未定義で使われているケースが多々あります。

まずこれらのインスタンス変数をきちんと定義してください。

あと、これは原因になっているかわかりませんが、メソッドの後の(の前に空白があります。これは取ったほうが良いです。例えば form_with (model:

投稿2020/09/20 10:50

winterboum

総合スコア23329

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

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

退会済みユーザー

退会済みユーザー

2020/09/26 02:28

返事が遅くなり申し訳ありません。 無事解決できました。 ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問