【问题标题】:Rails wrong number of arguments (1 for 2) in controllerRails 控制器中的参数数量错误(1 对 2)
【发布时间】:2014-12-07 05:57:07
【问题描述】:

我正在尝试使用 Ruby on Rails 制作一个将华氏温度转换为摄氏度的简单计算器。输入一些输入值后,我不断收到错误“参数数量错误(1 对 2)”。这个应用程序比它应该的要困难得多。我一直在修复错误,但无法解决这个问题。我读过的其他帖子与我正在尝试制作的这个简单的应用程序大不相同,也更复杂。感谢您的帮助。

控制器 ...

class CalculatorController < ApplicationController
  def calculate
    @farenheit = params[:temperature]

    unless @farenheit.blank?
      @farenheit = Temperature.calculate({ :farenheit => @farenheit})
    end

    @celsius = (@farenheit - 32) * (5.0 / 9.0)
  end

  private
    ## Strong Parameters 
    def user_params
      params.require(:farenheit)
    end
end

模型...

class Temperature < ActiveRecord::Base
  # attr_accessible :farenheit

  validates_presence_of :farenheit

  validates_numericality_of :farenheit
end

景色...

<h1>Temperature Calculator</h1>

<%= form_tag(calculator_calculate_path, method: "get", action: "calculate") do |form|%>
  <p>Please enter a temperature in degrees Farenheit</p>
  <%= text_field_tag 'temperature', @farenheit %></p>
  <%= submit_tag 'Convert' %>

  <h2>Result: </h2>
  <h3> <% @celsius %> </h3>

<% end %>

堆栈跟踪(前 10 行)...

activerecord (4.1.6) lib/active_record/relation/calculations.rb:109:in `calculate'
C:in `calculate'
app/controllers/calculator_controller.rb:6:in `calculate'
actionpack (4.1.6) lib/action_controller/metal/implicit_render.rb:4:in `send_action'
actionpack (4.1.6) lib/abstract_controller/base.rb:189:in `process_action'
actionpack (4.1.6) lib/action_controller/metal/rendering.rb:10:in `process_action'
actionpack (4.1.6) lib/abstract_controller/callbacks.rb:20:in `block in process_action'
activesupport (4.1.6) lib/active_support/callbacks.rb:113:in `call'
activesupport (4.1.6) lib/active_support/callbacks.rb:113:in `call'

【问题讨论】:

  • 应用程序跟踪是这样的:app/controllers/calculator_controller.rb:6:in `calculate'。完整的跟踪太长,无法发布。
  • 发布完整的堆栈跟踪,否则一切都是猜测。至少发布前 5 行
  • @PNY 已编辑帖子以包含堆栈跟踪头
  • Temperature.calculate类方法calculate,是你定义的还是你使用Active Record的类方法?如果你已经定义了,也可以在这里发布。

标签: ruby-on-rails ruby model-view-controller


【解决方案1】:

您在CalculatorController 中定义了实例方法calculate,但calculate 也是在ActiveRecord 中定义的类方法。就是你说的时候调用的 ActiveRecord 类方法

@farenheit = Temperature.calculate({ :farenheit => @farenheit})

并且该方法至少需要两个参数。以下是文档:

calculate(operation, column_name, options = {}) public

这会计算给定列中的聚合值。方法 计数、总和、平均值、最小值和最大值已添加为 捷径。 :conditions、:order、:group、:have 和 :joins 可以用来自定义查询。

http://apidock.com/rails/ActiveRecord/Calculations/ClassMethods/calculate

我不确定您为什么要使用计算类方法。为什么不只使用您对@celcius 的计算?以下应该让您的计算方法在没有 ArgumentError 的情况下工作:

  def calculate
    @farenheit = params[:temperature]

    unless @farenheit.blank?
      @celsius = (@farenheit.to_i - 32) * (5.0 / 9.0)
    end
  end

【讨论】:

  • 所以你的意思是我需要将我的计算方法命名为别的,因为这是一个受保护的词?这就是我在阅读文档后所理解的。当我更改名称时,我得到一个未定义的方法错误。还是我错过了你的意思?
  • 对不起,我编辑了我的答案以尝试实际上......好吧,提供一个解决方案......而不仅仅是识别问题。如果这没有帮助,请告诉我。
  • 谢谢,但是当我尝试这个解决方案(我之前尝试过)时,我又收到了类似“未定义方法 `-' for "23":String" 的错误(我输入了 23 )。我现在明白为什么上面的代码不起作用了,但是必须有某种方法来获取输入并通过公式运行它。当我尝试将条目转换为整数 (to_i) 时,它会引发“缺少模板”错误。
  • 与看起来相反,得到一个新的错误实际上是好的。我的意思是,如果它只是工作会更好,但是一个新的错误意味着你至少已经解决了你原来的问题。 :) 你有 app/views/calculator/index.html.erb 模板供 Rails 渲染吗?看看这个:guides.rubyonrails.org/…
  • 谢谢你,托尔!该指南非常有帮助,比我正在使用的 Oreilly 书更有帮助。显然它只需要一个重定向语句来知道去哪里。
猜你喜欢
  • 1970-01-01
  • 2014-10-13
  • 2015-09-12
  • 1970-01-01
  • 1970-01-01
  • 2012-02-07
  • 2012-04-15
  • 2015-04-26
  • 1970-01-01
相关资源
最近更新 更多