我遇到了一个问题,我在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'
答案 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])