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

Ruby on Rails 7选择时间范围更新图表时出现参数错误求助

问题诊断与解决方案

核心错误原因

ArgumentError (wrong number of arguments (given 0, expected 1)) 本质是某个需要参数的方法被调用时未传入参数,结合你提到参数已在请求中存在,大概率是控制器/模型方法的参数处理逻辑错误,而非参数未传递。


具体修复步骤

1. 修正控制器方法定义

Rails 控制器的 Action 方法默认不接收方法参数,参数需从 params 哈希中提取,而非作为方法入参。打开 static_pages_controller.rb,调整如下:

def latest_sales
  # 从请求参数中获取时间范围,默认设为7天
  timeframe = params[:timeframe] || "7_days"
  # 调用模型方法时传入参数
  sales_data = Sale.get_timeframe_sales(timeframe)
  render json: sales_data
end

2. 检查模型方法的参数接收

如果你的 Sale 模型中有处理时间范围的类方法,确保它明确接收 timeframe 参数:

class Sale < ApplicationRecord
  def self.get_timeframe_sales(timeframe)
    # 转换为天数
    days = timeframe.gsub("_days", "").to_i
    # 查询对应时间范围的销售数据
    where(created_at: days.days.ago..Time.current)
      .group_by_day(:created_at)
      .sum(:amount)
  end
end

3. 验证 Stimulus 请求逻辑

打开 latest_sales_controller.js,确保 AJAX 请求正确传递参数,且回调逻辑正常:

import { Controller } from "@hotwired/stimulus"
import Chartkick from "chartkick"
import "chartkick/chart.js"

export default class extends Controller {
  static targets = ["chart"]

  connect() {
    this.loadChart("7_days")
  }

  loadChart(event) {
    // 兼容初始调用和下拉框触发两种场景
    const timeframe = event.target?.value || event
    fetch(`/static_pages/latest_sales?timeframe=${timeframe}`)
      .then(res => res.json())
      .then(data => new Chartkick.LineChart(this.chartTarget, data))
      .catch(err => console.error("数据加载失败:", err))
  }
}

同时确保前端触发元素的 data-action 配置正确:

<select data-action="change->latest-sales#loadChart">
  <option value="7_days">7天</option>
  <option value="30_days">30天</option>
  <option value="90_days">90天</option>
</select>
<div data-latest-sales-target="chart"></div>

4. 确认路由配置

检查 config/routes.rb 是否正确映射请求路径:

get "/static_pages/latest_sales", to: "static_pages#latest_sales"

错误定位技巧

查看服务器错误日志的具体栈信息,比如:

ArgumentError (wrong number of arguments (given 0, expected 1)):
  app/models/sale.rb:4:in `get_timeframe_sales'
  app/controllers/static_pages_controller.rb:8:in `latest_sales'

这段日志直接指出错误发生在 Sale.get_timeframe_sales 方法,说明控制器调用该方法时未传参,针对性修正即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 11:42:40