无法解析 表单中的第一个参数不能包含 nil 或为空



我想要什么

我目前正在一个模仿Instagram的应用程序中实现一个评论功能。我想直接在帖子列表屏幕上显示评论列表和评论提交表格。

错误

ArgumentError in MainPage#main
First argument in form cannot contain nil or be empty

相关源代码

以下是一些你可能会发现相关的代码

main_page_controller.rb

class MainPageController < ApplicationController
def main
if logged_in?
@micropost = current_user.microposts.build
@feed_items = current_user.feed.paginate(page: params[:page])
end
end
end

micropost.rb

class Micropost < ApplicationRecord
belongs_to :user
has_many :likes, dependent: :destroy
has_many :love_users, through: :likes, source: :user
has_many :comments, dependent: :destroy
default_scope -> { order(created_at: :desc) }
mount_uploader :picture, PictureUploader
validates :user_id, presence: true
validates :content, presence: true, length: { maximum: 200 }
validates :picture, presence: true
validate  :picture_size
def love(user)
likes.create(user_id: user.id)
end
def unlove(user)
likes.find_by(user_id: user.id).destroy
end
def love?(user)
love_users.include?(user)
end
private
def picture_size
if picture.size > 5.megabytes
errors.add(:picture, "画像サイズを5MB以下にしてください")
end
end
end

comment.rb

class Comment < ApplicationRecord
belongs_to :user
belongs_to :micropost
validates :content, presence: true
validates :user_id, presence: true
end

microposts_controller.rb

class MicropostsController < ApplicationController
before_action :logged_in_user, only: [:create, :destroy]
before_action :correct_user, only: :destroy
def create
@micropost = current_user.microposts.build(micropost_params)
if @micropost.save
flash[:success] = "投稿しました"
redirect_to root_url
else
@feed_items = []
render 'new'
end
end
def destroy
@micropost.destroy
flash[:success] = "投稿を削除しました"
redirect_to request.referrer || root_url
end
def new
@micropost = current_user.microposts.build if logged_in?
end
def show 
@micropost = Micropost.find(params[:id])
@comment = Comment.new
@user = User.find_by(id: @micropost.user_id)
end
private
def micropost_params
params.require(:micropost).permit(:content, :picture)
end
def correct_user
@micropost = current_user.microposts.find_by(id: params[:id])
redirect_to root_url if @micropost.nil?
end
end

comments_controller.rb

class CommentsController < ApplicationController
def create
@micropost = Micropost.find(params[:micropost_id])
@comment = @micropost.comments.build(comment_params)
@comment.user = current_user
if @comment.save
flash[:success] = "投稿しました"
redirect_to root_url
else
flash.now[:danger] = "投稿できませんでした"
redirect_to root_url
end
end
def destroy
@comment = Comment.find_by(id: params[:id])
@comment.destroy
redirect_to root_url
end
private 
def comment_params
params.require(:comment).permit(:content)
end
end

micropost.html.erb

<li id="micropost-<%= micropost.id %>" data-micropost-id="<%= micropost.id %>">
<%= link_to gravatar_for(micropost.user, size: 50), micropost.user %>
<%= link_to micropost.user.name, micropost.user %>
<span class="content">
<%= micropost.content %>
<%= image_tag micropost.picture.url if micropost.picture? %>
</span>
<span class="timestamp">
<%= time_ago_in_words(micropost.created_at) %>前に投稿
<% if current_user?(micropost.user) %>
<%= link_to "削除", micropost, method: :delete, data: { confirm: "削除してもよろしいですか?" } %>
<% end %>
</span>
<%= render "likes/like", micropost: micropost %>
<div class="comment_index">
<% @micropost.comments.each do |comment| %>
<%= link_to comment.user.name, comment.user %>
<%= comment.content %>
<span class="delete">
<%= link_to "削除", [@micropost, comment], method: :delete if current_user?(comment.user) %>
</span>
<% end %>
</div>
<div class="comment-form">
<%= form_for([@micropost, @comment]) do |f| %>
<%= render 'shared/error_messages', object: f.object %>
<div class="field">
<%= f.text_area :body, placeholder: "コメントを入力" %>
</div>
<%= f.submit "投稿", class: "btn btn-primary" %>
<% end %>
</div>
</li>

routes.rb

Rails.application.routes.draw do
get 'likes/create'
get 'likes/destroy'
get 'sessions/new'
root 'main_page#main'
get '/signup', to: 'users#new'
get '/login', to: 'sessions#new'
post '/login', to: 'sessions#create'
delete '/logout', to: 'sessions#destroy'
get '/newpost', to: 'microposts#new'
resources :users do
member do
get :following, :followers
end
end
resources :microposts, only: [:create, :destroy] do
resources :comments, only: [:create, :destroy]
end
resources :relationships, only: [:create, :destroy]
resources :testsessions, only: :create
resources :likes, only: [:create, :destroy]
end

已尝试

错误声明说第一个参数要么为零,要么为空,但Mainpage#main定义了@micpost。我还尝试在控制台中创建微柱数据,效果很好。我四处寻找可能的因素,但他们没有解决

补充

我正在使用铁轨(6.0.2.1(我问了同样的问题,但并没有得到答案。https://teratail.com/questions/254164

我读过

表单中的第一个参数不能包含nil或为空-Rails 4

尝试更换

form_for([@micropost, @comment])

带有

form_for([@micropost, Comment.new])

以前,我试图直接在帖子列表页面上显示评论和评论提交表单,但我通过创建一个单独的微帖子显示页面并在那里显示来实现这一点。

最新更新