Rails加入查询 - 错误的参数数量(0表示1)

时间:2015-06-18 13:04:53

标签: ruby-on-rails ruby ruby-on-rails-4

我遇到了一个问题,我在Rails中对表进行查询,Rails返回一个错误,说我正在发送一个参数。

这是控制器代码:

def destroy
  @version = Version.where(number: params[:number]).joins(:packages).where(packages: {name: params[:name]}).all
  if @version.destroy
    render json: {}, status: 204
  else
    render json: { "error": "Version could not be deleted." }, status: 422
  end
end

这是失败的测试:

describe "DELETE #destroy" do
  context "valid parameters" do
    before { @package = FactoryGirl.create(:package) }
    before { @version = FactoryGirl.create(:version) }
    it "deletes the version" do
      expect {
        delete :destroy, format: :json, access_token: @token.token, name: @package.name, number: @version.number
      }.to change(Version, :count).by(-1)
    end

    it "returns 204" do
      delete :destroy, format: :json, access_token: @token.token, name: @package.name, number: @version.number
      response.status.should eq(204)
    end
  end
end

以下是错误消息:

Failure/Error: delete :destroy, format: :json, access_token: @token.token, name: @package.name, number: @version.number
 ArgumentError:
   wrong number of arguments (0 for 1)
 # ./app/controllers/api/v0/versions_controller.rb:19:in `destroy'

1 个答案:

答案 0 :(得分:4)

您将@version设置为集合(ActiveRecord::Relation)而不是单数记录实例。集合上的destroy需要参数。如果要销毁此集合中的每条记录,可以使用destroy_all

@versions.destroy_all

注意:我将您的实例变量重命名为复数形式,因此现在没有误导。

如果您只想查找一个Version并将其销毁,则可以执行以下操作:

@version = Version.joins(:packages).where(packages: {name: params[:name]}).find_by(number: params[:number])