为什么ActiveRecord只查找id = 1的模型对象?

时间:2012-11-14 15:04:06

标签: ruby-on-rails activerecord

我正在尝试销毁属于某个类别模型的链接(通过我的浏览器)。我可以成功删除id 1category_id 1的链接,但是当我尝试删除包含任何其他ID的链接时,我会遇到:

ActiveRecord::RecordNotFound in LinksController#destroy
Couldn't find Link with id=1 [WHERE "links"."category_id" = 1]

非常令人沮丧,因为我不是要删除id为1的链接!但我在请求参数中看到,无论我点击什么链接,它总是试图删除"category_id"=>"1", "id"=>"1"}的链接。查看我的开发数据库中的链接确认它们存在并且具有不是1的<...

这是LinksController#destroy的代码:

class LinksController < ApplicationController

def destroy
    @category = Category.find(params[:id])
    @link = @category.links.find(params[:id])
    @link.destroy
    redirect_to category_url(@category)
end

以下是我试图删除这些讨厌的链接的视图代码:

<h1><%= @category.category %></h1>
<p><%=  @category.description %></p> 
<ul>
    <% @category.links.each do |link| %>
    <li>
    <%= link_to link.title, link.url %> |
    <%= link_to "delete", category_link_path(@category), :method => :delete %>
    </li>
 <% end %>

编辑:添加参数

{"_method"=>"delete",
 "authenticity_token"=>"[removed]",
 "category_id"=>"1",
 "id"=>"1"}

编辑:添加了config / routes.rb:

LinkManager::Application.routes.draw do

  resources :categories do
    resources :links, only: [:create, :destroy]
  end

  root :to => 'categories#index'

我在俯瞰什么?有什么我可以尝试的吗?

2 个答案:

答案 0 :(得分:1)

您对category_link_path的致电正在忽略某些事情。也许它应该是这样的?

<%= link_to "delete", category_link_path(@category, link), :method => :delete %>

通过传递category_id看起来您正在履行路线的@category部分,但您还需要提供link作为id

然后您需要修复destroy行为:

def destroy
  @category = Category.find(params[:category_id])
  @link = @category.links.find(params[:id])
  @link.destroy
  redirect_to category_url(@category)
end

答案 1 :(得分:1)

在您的category_link_path上,您应该传递您的类别以及您的链接。

之类的东西

category_link_path(@category, link)

此外,在您的控制器上,要查找您的类别,它应该看起来像Category.find(params[:category_id]