Q&A
現在、「param is missing or the value is empty: comment」というエラーが、CommentsController#createで発生しています。
http://original-app-takasakifuse.c9users.io:8080/posts/5/comments
コードは以下の通りです。
toppage_controller
class ToppagesController < ApplicationController def index if logged_in? @user = current_user @post = current_user.posts.build # form_for 用 @posts = current_user.feed_posts.order('created_at DESC').page(params[:page]) @comment = @post.comments.build @comments = @post.comments.order('created_at DESC').page(params[:page]) end end end
comment_controller
class CommentsController < ApplicationController #before_action :set_comment, only: [:new,:create, :destroy] before_action :require_user_logged_in def create @post = Post.find(params[:post_id]) @comment = @post.comments.create(comment_params) @comment.user_id = current_user.id #@comment = current_user.posts.comments.build(comment_params) #@comment = Comment.create(text: comment_params[:text], post_id: comment_params[:post_id], user_id: current_user.id) if @comment.save flash[:success] = "コメントしました。" #redirect_to "/posts/#{@comment.post.id}" #redirect_to post_comments_path(@post.id) #redirect_to :action =>"new" redirect_back(fallback_location: root_path) else @comments = @comments.order('created_at DESC').page(params[:page]) flash.now[:danger] = 'コメントの投稿に失敗しました。 render 'toppages/index' end end def destroy @comment.destroy flash[:success] = 'コメントを削除しました。' redirect_back(fallback_location: root_path) end private # Use callbacks to share common setup or constraints between actions. def set_comment @post = Post.find(params[:post_id]) @comment = @post.comments.find(params[:id]) end # Never trust parameters from the scary internet, only allow the white list through. def comment_params params.require(:comment).permit(:user_id, :post_id, :content) end end
user_controller
class UsersController < ApplicationController before_action :require_user_logged_in, only: [:index, :show, :edit, :destroy, :followings, :followers] def index @users = User.all.page(params[:page]) end def show @user = User.find(params[:id]) @posts = @user.posts.order('created_at DESC').page(params[:page]) @comment = Comment.create(user_id: @user.id) @comments = @posts.comments counts(@user) end def new @user = User.new end def create @user = User.new(user_params) if @user.save flash[:success] = 'ユーザを登録しました。' redirect_to @user else flash.now[:danger] = 'ユーザの登録に失敗しました。' render :new end end def edit @user = User.find(params[:id]) render :edit end def update @user = User.find(params[:id]) if @user.update_attributes(user_params) redirect_to @user flash[:success] = "プロフィールを更新しました" else flash.now[:danger] = 'プロフィールを更新できませんでした。' render'edit' end end def destroy @user = User.find(params[:id]) @user.destroy flash[:success] = 'ユーザー登録を解除しました。' redirect_back(fallback_location: root_url) end def followings @user = User.find(params[:id]) @followings = @user.followings.page(params[:page]) counts(@user) end def followers @user = User.find(params[:id]) @followers = @user.followers.page(params[:page]) counts(@user) end private def user_params params.require(:user).permit(:name, :email, :password, :password_confirmation, :introduction, :address, :age) end end
posts_html.erb
<ul class="media-list"> <% posts.each do |post| %> <% user = post.user %> <li class="media"> <div class="media-left"> <img class="media-object img-rounded" src="<%= gravatar_url(user, options = { size: 50 }) %>" alt=""> </div> <div class="media-body"> <div> <%= link_to user.name, user_path(user) %> <span class="text-muted">posted at <%= post.created_at %></span> </div> <div> <p><%= image_tag post.picture,:size =>"280x210" %></p> <p><%= post.content %></p> <% if @comments %> <% @comments.each do |comment| %> <div class="name2">投稿者:<%= link_to comment.user.username, "/users/#{comment.user_id}" %> 投稿日時:<%= comment.created_at.strftime("%Y-%m-%d %H:%M:%S") %></div> <div class="name2"><%= comment.text %></div> <% end %> <% end %> <br/> <% if current_user %> <%= form_tag(post_comments_path(post.id), method: :post) do %> <textarea cols="30" name="text" placeholder="コメントする" rows="2"></textarea> <br/> <input type="submit" value="コメントの投稿"> <% end %> <% end %> </div> <div> <% if current_user == post.user %> <%= link_to "削除", post, method: :delete, data: { confirm: "本当に削除してよろしいですか?" }, class: 'btn btn-danger btn-sm' %> <% end %> </div> </div> </li> <% end %> <%= paginate posts %> </ul>
コメントのマイグレーションファイル
class CreateComments < ActiveRecord::Migration[5.0] def change create_table :comments do |t| t.references :user, foreign_key: true t.references :post, foreign_key: true t.string :content t.timestamps end end end
コメントのモデル
class Comment < ApplicationRecord belongs_to :user belongs_to :post end
ルーティング
routes.rb
Rails.application.routes.draw do root to: 'toppages#index' get 'login', to: 'sessions#new' post 'login', to: 'sessions#create' delete 'logout', to: 'sessions#destroy' resources :users do member do get :followings get :followers end collection do get :search end end resources :posts, only: [:create, :destroy, :show] , shallow: true do resources :comments, only: [:create, :destroy] end resources :relationships, only: [:create, :destroy] get 'signup', to: 'users#new' end
/posts を表示したときのコメントのフォームの <form> タグの部分(ブラウザーで HTML ソースを表示してその HTML 断片)
<form class="new_comment" id="new_comment" action="/posts/5/comments" accept-charset="UTF-8" method="post"><input name="utf8" type="hidden" value="✓" /><input type="hidden" name="authenticity_token" value="4i0OQgfiY2xoD/pIvEJI9XtKhTfJnyjRfZAVOVJ9i9wvQSHu/zWiXB7b6HA35FG0AdkwxgS4AgM2jPEkA+r+Ug==" /> <textarea cols="30" placeholder="コメントする" rows="2" name="comment[content]" id="comment_content"> </textarea> <input type="submit" name="commit" value="コメントの投稿" data-disable-with="コメントの投稿" /> </form>
やりたいこと:トップページに表示されているPostにコメントを投稿する。
やったこと:http://nograve.hatenadiary.jp/entry/2015/11/05/161948を参考に、user_controllerのusers#showの部分を修正した。
このようにしても解決できませんでした。
なぜ、ParameterMissingが発生しているのか?
これを解決するにはどうすればいいのか?
以上についてご教示していただけないでしょうか?
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2018/01/22 14:49 編集
2018/01/22 15:14
2018/01/22 15:28
2018/01/23 03:27
2018/01/23 10:48
2018/01/25 23:21
2018/01/26 03:53
2018/01/26 12:32 編集
2018/01/26 13:08
2018/01/26 13:10
2018/01/26 13:52
2018/01/26 14:34