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

Rails提交乘客信息时出现undefined method `id' for nil:NilClass错误

解决Rails航班预订系统提交时的NoMethodError问题

问题原因

提交表单触发NoMethodError有两个核心原因:

  1. 当@booking.save失败并执行render :new时,create方法未初始化@flight变量,导致视图中调用@flight.id时@flight为nil。
  2. 新建的乘客对象未保存到数据库,无id属性,视图中p.object.id的调用会引发潜在报错(当前直接触发的是前者,但后者也是必须修复的问题)。

解决方案

1. 修复create方法中的@flight初始化

修改BookingsController的create方法,确保渲染new视图时@flight已正确初始化,同时保证乘客数量匹配:

class BookingsController < ApplicationController
  def new
    @booking = Booking.new
    @flight = Flight.find(params[:flight_id])
    params[:tickets].to_i.times{ @booking.passengers.build }
  end

  def create
    @booking = Booking.new(booking_params)
    # 从提交的参数中获取航班ID,初始化@flight
    @flight = Flight.find(booking_params[:flight_id])

    if @booking.save
      redirect_to flights_path
    else
      # 确保乘客数量与提交时一致,避免视图缺失乘客字段
      passenger_count = params[:booking][:passengers_attributes]&.size || 0
      @booking.passengers.build while @booking.passengers.size < passenger_count
      render :new, status: :unprocessable_entity
    end
  end

  private

  def booking_params
    params.require(:booking).permit(:flight_id, passengers_attributes: [:name, :email])
  end
end

2. 移除或条件化处理乘客的id隐藏字段

新建乘客未持久化,无id属性,直接移除不必要的id隐藏字段:
修改new.html.erb中的乘客表单部分:

<% @booking.passengers.each do |passenger| %>
  <%= form.fields_for :passengers_attributes, passenger do |p| %>
    <!-- 移除该行,新建乘客无id -->
    <%#= p.hidden_field :id, value: p.object.id %>

    <%= p.label :name %>
    <%= p.text_field :name %>
      
    <%= p.label :email %>
    <%= p.email_field :email %><br><br>  
  <% end %>
<% end %>

若后续需支持编辑场景,可添加条件判断仅在乘客已持久化时显示:

<%= p.hidden_field :id, value: p.object.id if p.object.persisted? %>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.22 16:35:08