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

RoR租赁系统添加租赁时间报错:参数数量不符问题排查

排查Ruby on Rails租赁系统创建租赁记录时的ArgumentError错误

首先看你的错误日志,ArgumentError (wrong number of arguments (given 0, expected 2)) 指向控制器的create方法,结合你的代码,核心问题出在模型关联的写法错误,再加上缺少用户关联的逻辑,导致了这个错误和回滚。

错误原因分析

  • Acquiretime模型关联写错:你写了belongs_to :users,但belongs_to关联必须用单数形式(对应单个关联记录),复数形式会让Rails生成错误的关联方法,调用时参数不匹配,直接触发ArgumentError。
  • User模型关联不符合业务逻辑:has_one :acquiretime意味着一个用户只能有一条租赁记录,这显然不合理,应该是has_many :acquiretimes。
  • 控制器未关联当前用户:Rails 5+中belongs_to默认是必填的,你的Acquiretime需要关联用户,但创建时没把current_user绑定到记录上,导致验证失败触发回滚。

解决方案

1. 修正模型关联

Acquiretime模型

把复数的users改成单数的user:

class Acquiretime < ApplicationRecord
  belongs_to :item
  belongs_to :user  # 改为单数形式
  validates :required_time, :return_time, presence: true
end

User模型

把has_one改成has_many,匹配多租赁记录的业务场景:

class User < ApplicationRecord
  has_many :items
  has_many :acquiretimes  # 支持用户拥有多条租赁记录
end

2. 修复控制器逻辑,绑定当前用户

修改AcquiretimesController的create方法,创建租赁记录时关联current_user,同时调整判断逻辑(原来的valid?不会执行保存,改用save直接判断是否保存成功):

class AcquiretimesController < ApplicationController
  def create
    @item = Item.find(params[:item_id])
    # 绑定当前用户到租赁记录
    @acquiretime = @item.acquiretimes.build(time_params.merge(user: current_user))
    
    if @acquiretime.save
      flash[:success] = "You have successfully rented the item"
      redirect_to root_path
    else
      flash[:alert] = "Woops! Looks like there has been error. Please enter valid data."
      redirect_to root_path
    end
  end

  private
  def time_params
    params.require(:acquiretime).permit(:required_time, :return_time)
  end
end

3. 确认数据库表结构(可选)

如果你的acquiretimes表还没有user_id外键,需要生成迁移添加:

rails generate migration AddUserIdToAcquiretimes user:references
rails db:migrate

(item_id应该已经存在,因为日志里能正常加载Item)

4. 补充控制器的new方法(确保视图路径正确)

如果你的视图是通过new动作渲染的,需要在控制器里添加new方法初始化变量:

def new
  @item = Item.find(params[:item_id])
  @acquiretime = @item.acquiretimes.build
end

为什么这样能解决问题?

  • 修正belongs_to :user后,Rails能正确识别关联,不会生成错误的方法,也就不会触发参数不匹配的ArgumentError。
  • 绑定current_user后,租赁记录能满足belongs_to :user的必填验证,不会再触发回滚。
  • 调整关联逻辑后,业务模型也更符合实际租赁场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 07:38:10