提问人:Splohr 提问时间:3/16/2023 最后编辑:Splohr 更新时间:3/17/2023 访问量:124
Ruby on Rails 7 参数错误(给定 0,预期为 1) 当用户选择更新图表的时间范围时
Ruby on Rails 7 Argument Error (given 0, expected 1) When User Selects Timeframe to Update Chart
问:
希望你能帮上忙,即使是 ChatGPT4 也无法解决这个问题。
我有一个 Ruby on Rails 7 应用程序,我正在尝试查询一个 API,以根据用户选择的时间范围(例如 7 天、30 天和 90 天)拉动商品的销售。
我收到一个参数错误,但看起来参数正在它之前的这一行中传递:因为我将默认值设置为 30 天,所以我知道用户选择了 90 天ArgumentError (wrong number of arguments (given 0, expected 1))
Parameters: {"timeframe"=>"90_days", "static_page"=>{"timeframe"=>"90_days"}}
我正在尝试使用 Stimulus 和 Chartkick Gem 来完成这项工作。 任何帮助都非常感谢!
这是我latest_sales_controller.js文件:
import { Controller } from "@hotwired/stimulus"
export default class extends Controller {
static targets = ["latestSalesChart"]
updateChart(event) {
const timeframe = event.target.value;
console.log("Timeframe dara:", timeframe); // log the timeframe to the console
const csrfToken = document.querySelector('meta[name="csrf-token"]').getAttribute('content');
const body = JSON.stringify({ timeframe });
console.log("Body Data", body);
fetch('/home/last_sales_chart', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-CSRF-Token': csrfToken
},
body
})
.then(response => response.json())
.then(data => {
console.log('Response Data'); // log the response data to the console
console.log(data); // log the response data to the console
const chartData = data.chart_data;
console.log("Chart Data", chartData)
const chart = Chartkick.charts[this.latestSalesChartTarget.id];
chart.updateData(chartData);
})
.catch(error => console.log(error));
}
}
这是我的 static_pages_controller.rb 文件:
class StaticPagesController < ApplicationController
def home
require 'httparty'
require 'groupdate'
puts "last sales: #{last_sales_chart}"
@chart_data = last_sales_chart
puts "chart data #{@chart_data.inspect}"
end
def about
end
def last_sales_chart
timeframe = params[:timeframe]
timewindow = get_timewindow(timeframe)
chart_data = generate_chart_data(timewindow)
return chart_data
end
private
def get_timewindow(timeframe)
current_day = DateTime.now
case timeframe
when "7_days"
(current_day - 7).strftime("%Y-%m-%d")
when "30_days"
(current_day - 30).strftime("%Y-%m-%d")
when "90_days"
(current_day - 90).strftime("%Y-%m-%d")
else
(current_day - 30).strftime("%Y-%m-%d")
end
end
def generate_chart_data(timewindow)
puts "Timewindow data #{timewindow}"
query = {
query: "query LastSalePrice {
tokens(where: {fa2_address: {_eq: \"KT1LHHLso8zQWQWg1HUukajdxxbkGfNoHjh6\"},
events: {timestamp: {}}, last_sale_at: {_gte: \"#{timewindow}\"}},
order_by: {last_sale_at: desc_nulls_last, last_sales_price: asc}) {
fa2_address
last_sale_at
last_sales_price
token_id
name
}
}"
}
response = HTTParty.post('https://api.teztok.com/v1/graphql',
body: query.to_json,
headers: { 'Content-Type' => 'application/json' })
response_body = JSON.parse(response.body)
data = response_body["data"]["tokens"].map do |token|
{ timestamp: token["last_sale_at"], token_id: token["token_id"],
last_sales_price: sprintf('%.6f', token["last_sales_price"]/1000000.0) }
end
chart_data = []
data.each do |d|
chart_data << [d[:timestamp], d[:last_sales_price]]
end
return chart_data
end
end
这是我的观点部分 _last_sales_chart.html.erb 文件:
<div class="outside"
data-controller="latest-sales"
data-latest-sales-chart-target="latestSalesChart">
<div class="form-group">
<%= label_tag 'timeframe', 'Select Timeframe', class: 'form-label' %>
<%= select_tag :timeframe, options_for_select([['Last 7 Days', '7_days'], ['Last 30 Days', '30_days'], ['Last 90 Days', '90_days']]), data: { action: "change->latest-sales#updateChart" } %>
</div>
<div id="latest-sales">
<h3><a href="https://objkt.com/collection/tezzardz"
rel="noopener noreferrer" id="nft-name">Tezzardz</a> Sales Over the Last Month</h3>
<div id="chart">
<%= line_chart @chart_data, suffix: "ꜩ", id: "latestSalesChart", ytitle: "Last Sales Price ꜩ", points: false %>
</div>
</div>
</div>
这是我的routes.rb文件:
Rails.application.routes.draw do
draw :madmin
root "static_pages#home"
post "/home/last_sales_chart", to: "static_pages#home#last_sales_chart"
get "/about", to: "static_pages#about"
end
这是我的 gem 文件:
source "https://rubygems.org"
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby "3.1.2"
gem "rails", "7.0.3"
gem "faker", "2.21.0"
gem "sassc-rails", "2.1.2"
gem "sprockets-rails", "3.4.2"
gem "importmap-rails", "1.1.0"
gem "turbo-rails", "1.1.1"
gem "stimulus-rails", "1.0.4"
gem "jbuilder", "2.11.5"
gem "puma", "5.6.4"
gem "devise"
gem "bootsnap", "1.12.0", require: false
gem "madmin", "~> 1.2"
gem 'httparty'
gem 'chartkick'
gem 'groupdate'
gem 'bootstrap', "~> 5.2.2"
gem "will_paginate-bootstrap-style"
# Bundle and transpile JavaScript [https://github.com/rails/jsbundling-rails]
gem "jsbundling-rails"
group :development, :test do
gem "sqlite3", "1.4.2"
gem "debug", "1.5.0", platforms: %i[ mri mingw x64_mingw ]
end
group :development do
gem "web-console", "4.2.0"
end
group :test do
gem "capybara", "3.37.1"
gem "selenium-webdriver", "4.2.0"
gem "webdrivers", "5.0.0"
gem "rails-controller-testing", "1.0.5"
gem "minitest", "5.15.0"
gem "minitest-reporters", "1.5.0"
gem "guard", "2.18.0"
gem "guard-minitest", "2.4.6"
end
group :production do
gem "pg", "1.3.5"
end
这是我收到的Rails服务器中的错误:
Processing by StaticPagesController#update_chart_data as */*
Parameters: {"timeframe"=>"30_days", "static_page"=>{"timeframe"=>"30_days"}}
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 802)
ArgumentError (wrong number of arguments (given 0, expected 1)):
app/controllers/static_pages_controller.rb:17:in `update_chart_data'
谢谢!
答:
2赞
Alex Zakruzhetskyi
3/16/2023
#1
由于是控制器中的一个动作,我认为它不应该接收参数。它的声明应该像你必须直接从update_chart_data
def update_chart_data
timeframe
params
评论
0赞
Splohr
3/17/2023
你是对的,这样做我能够让参数正确传递,但现在我在我的控制台日志中得到一个。根据其他调试,我认为当我调用时,我的 js 控制器有问题。仍在试图弄清楚它是什么,但我相信可能是传递了不正确的参数。SyntaxError: JSON.parse: unexpected character at line 1 column 1 of the JSON data
fetch
1赞
Splohr
3/20/2023
回来并标记此答案为正确。答案最终回答了我最初关于传递论点的问题。最终的解决方案要求我重新编写代码并使用涡轮增压框架。
评论
byebug
ruby-debug