Ruby on Rails:错误的参数数量(0表示1)即使提供

时间:2018-04-24 21:45:11

标签: ruby-on-rails ruby elasticsearch

我们继承了rails项目(整个基于elasticsearch)。因此,应用程序列出了用户满足所提供的搜索标准的所有文档。想象一下,一旦你选择了一个方面,即一个特定的日期范围,它会为你提供当时创建的文件。

我们目前正在努力扩展其功能:

  

我们的首要任务是 利用弹性查询 ,以便 全部   该查询匹配的 文档可以 多次修改 (在   我们的情况,我们一直试图隐藏所有文件)。然后我们想要将查询发送到适当的rake任务来处理它。

点击负责大量隐藏的按钮后,控制器的create方法被调用,从而在数据库中创建一个mass_hiding记录(为方便起见,我们会跟踪隐藏信息,以便我们恢复之后的群众行动)。

  def create
    mh = current_user.mass_hidings.build(params[:mass_hiding])
    mh.save!
    mass_hide(mh.query_params)
    redirect_to search_documents_path(mass_hide.search_parameters)
  end  

  def mass_hide(query)
    search = factic.create_restrictions_search(MultiJson.load(query.to_json))
    Resque.enqueue(Document::Jobs::HideDocuments, nil, search.to_scrollable.build_query)
  end

但是,创建方法mass_hide(mh.query_params) 3 行会在执行后触发以下异常:

  

Admin :: MassHidingsController #creore中的ArgumentError    错误的参数数量(0表示1)

     

可以找到完整跟踪 here

Parameters:

{"utf8"=>"✓",
 "authenticity_token"=>"6mZvRcp4HJuoBWMRToA2gPec9Wv8T82hiTJQ/STf1j/sDhQ+16mBW3QkRmhqlJIHKR0kvX/kqwQh205hp6RuDg==",
 "mass_hiding"=>{"serialized_query_params"=>"{}",
 "description"=>"test"},
 "commit"=>"Hide documents"}

此外,这里是mass_hiding的架构表示以及相应的模型:

schema.rb

create_table "mass_hidings", force: :cascade do |t|
    t.integer  "user_id"
    t.text     "serialized_query_params"
    t.string   "description"
    t.datetime "created_at",              null: false
    t.datetime "updated_at",              null: false
end

mass_hiding.rb

class MassHiding < ActiveRecord::Base
  attr_accessible :serialized_query_params, :description
  belongs_to :user

  def query_params=(params)
    self.serialized_query_params = Oj.dump(params)
  end

  def query_params
    Oj.load(self.serialized_query_params).with_indifferent_access
  end

  def self.find_or_initialize_by_user_and_query_params(user, query_params)
    self.find_or_initialize_by_user_id_and_serialized_query_params(user.id, Oj.dump(query_params))
  end
end

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:2)

问题是你已经定义了这个辅助函数:

def mass_hide(query)

但是你用零参数调用它。

当你说mass_hide(mh.query_params)时,首先用一个参数调用它。没关系。

然后在下一行你也会说mass_hide.search_parameters。 Ruby意味着mass_hide().search_parameters。也许你打算写mh.search_parameters?我不确定。但是mass_hide是需要1个参数的方法,而且是传递它的调用点0。

我希望有所帮助!