You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Ruby on Rails新手求助:No route matches缺失必填键[:id]错误

Fixing the "No route matches missing required keys: [:id]" Error in Ruby on Rails

Hey there! I’ve been stuck on this exact error when I was new to Rails, so I totally get how frustrating it can feel. Let’s break down what’s going on and fix it step by step.

First, Understand the Error

This error pops up when you’re trying to generate a route (like with link_to, form_for, or redirecting) but you haven’t provided the required :id parameter that Rails expects. For example, routes generated by resources :halls (I’m guessing your incomplete resources :ha... is this) need a hall’s ID to build URLs like /halls/1 or /halls/1/comments.

Step 1: Confirm Your Full Route Configuration

First, let’s make sure your config/routes.rb is complete. Since your models have Hall has_many :comments, you probably want nested routes to tie comments to their parent halls. Update your routes to look like this:

devise_for :users
resources :halls do
  resources :comments # Nests comments under halls
end

Run rails routes in your terminal to see all generated routes—you’ll notice routes like hall_comments_path that require a :hall_id parameter.

Step 2: Check Controller Logic

For Halls Controller

Make sure your show action correctly fetches the hall by ID—this is where most view-related errors start:

class HallsController < ApplicationController
  def show
    @hall = Hall.find(params[:id]) # This grabs the hall using the :id from the URL
    @comment = @hall.comments.new # Prepares a blank comment for the form
  end
end

For Comments Controller

Since comments belong to halls, you need to fetch the parent hall before creating a comment. Add a before_action to handle this:

class CommentsController < ApplicationController
  before_action :set_hall, only: [:create]

  def create
    @comment = @hall.comments.build(comment_params)
    @comment.user_id = current_user.id # Link the comment to the logged-in user

    if @comment.save
      redirect_to @hall, notice: 'Comment added successfully!'
    else
      render 'halls/show'
    end
  end

  private
  def set_hall
    @hall = Hall.find(params[:hall_id]) # Grabs the hall ID from the nested route
  end

  def comment_params
    params.require(:comment).permit(:content) # Adjust based on your comment fields
  end
end

Step 3: Fix View Code

Linking to a Hall

If you’re using link_to to point to a hall’s show page, make sure you pass the hall object (which Rails uses to get the ID):

<%# Wrong - missing the hall object %>
<%= link_to 'View Hall', hall_path %>

<%# Correct - passes the @hall object %>
<%= link_to 'View Hall', @hall %>
<%# Or explicitly: %>
<%= link_to 'View Hall', hall_path(@hall) %>

Comment Form in Hall Show Page

Since comments are nested under halls, your form needs to reference both the hall and the comment:

<%# In app/views/halls/show.html.erb %>
<%= form_for [@hall, @comment] do |f| %>
  <%= f.label :content %>
  <%= f.text_area :content %>
  <%= f.submit 'Add Comment' %>
<% end %>

This tells Rails to use the nested hall_comments_path route, which includes the required :hall_id.

Step 4: Double-Check Redirects

If you’re redirecting in a controller action, make sure you’re passing the correct object:

<%# Wrong - no ID provided %>
redirect_to hall_path

<%# Correct %>
redirect_to @hall

Final Tip

Run rails routes often! It shows you exactly what parameters each route expects, so you can spot where you’re missing an :id or :hall_id quickly.

内容的提问来源于stack exchange,提问作者krneki

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 03:47:20