【问题标题】:Argument error; wrong number of arguments given参数错误;给出的参数数量错误
【发布时间】:2021-08-05 04:24:50
【问题描述】:

Ruby on Rails 的新手,对此我一直很头疼。我一直在这里按照本教程制作此表单以将记录保存到我的数据库中 - https://human-se.github.io/rails-demos-n-deets-2020/demo-resource-create/

这是我的控制器:

class ViewaddparamController < ActionController::Base
    def view_add_param
        newParam = ViewaddparamController.new
        respond_to do |format|
            format.html{ render :viewaddparam, locals: { newParam: newParam } }
        end
    end

    def add_param
        # new object from params
        mlParam = ViewaddparamController.new(params.require(:Viewaddparam_Controller).permit(:name, :machine_model, :parameter_1, :parameter_2, :parameter_3, :data_train_set, :start_date, :end_date))
        # respond_to block
        respond_to do |format|
            format.html do
                if mlParam.save
                    # success message
                    flash[:success] = "ML parameters saved successfully"
                    # redirect to index
                    redirect_to model_url
                else
                    # error message
                    flash.now[:error] = "Error: parameters could not be saved"
                    # render new
                    render :viewaddparam, locals: { newParam: newParam }
                end
            end
        end
    end
end

我的路线:

  get 'viewparam', to: 'viewaddparam#view_add_param'
  post 'add_param', to: 'viewaddparam#add_param', as: 'add_param'

我的看法:

<%= form_with model: newParam, url: add_param_path, method: :post, local: true, scope: :Viewaddparam_Controller do |f| %>

...

每当我尝试提交表单时,我都会收到此错误

ArgumentError in ViewaddparamController#add_param
Wrong number of arguments (given 1, expected 0)

在我的控制器类第 11 行突出显示的错误。

我在这里做错了什么?我一遍又一遍地查看教程,但我看不到这里的错误。

提前致谢。

【问题讨论】:

  • mlParam = ViewaddparamController.new(params.require(:Viewaddparam_Controller) 我认为它需要是模型,但是您使用的控制器不接受任何参数,并且您正在传递一个导致问题的原因。

标签: ruby-on-rails ruby


【解决方案1】:

您似乎将 ViewaddparamController 视为控制器(在 Rails 术语中是响应用户请求的控制器)和数据模型。

控制器和模型之间通常存在一对一的关联,尤其是当您遵循所谓的 RESTful 模式时。因此,如果您的模型是 Product,您可以使用 resources 指令在路由中设置它:

resources :products

这将使应用程序设置为期望使用ProductsController。而且,使用与您的示例类似的编码风格,看起来有点像:

class ProductsController < ApplicationController
  def new
    product = Product.new
    render :new, locals: { product: product }
  end

  def create
    product = Product.new(params.require(:product).permit(…))
    # etc
  end
  
  # etc
end

所以你可以从这个例子中看到控制器和模型是相关的,但是命名不同。

通过在你应该使用模型的地方使用你的控制器名称,你在控制器上调用#new,这通常不是你需要做的——控制器实例由 Rails 应用程序框架管理。而且它们的初始化程序不接受任何参数,因此 Ruby 抱怨说,一个接受 0 个参数的初始化程序被赋予 1。

【讨论】:

  • 谢谢!我没有注意到对象创建应该是模型类的名称。希望教程更清晰!
猜你喜欢
  • 2023-03-03
  • 1970-01-01
  • 2013-06-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-22
相关资源
最近更新 更多