2014-10-04 52 views
1

我不能自定义操作应对在任务控制器我有行动:在控制器

def destroy_all 
    current_user.tasks.destroy 
    redirect_to root_path 
    end 

我的数据库架构看起来象下面这样:

create_table "tasks", force: true do |t| 
    t.string "content" 
    t.boolean "done" 
    t.datetime "created_at" 
    t.datetime "updated_at" 
    t.string "users_id" 
    end 

和我有关系:任务belongs_to的用户和用户has_many任务。 通过操作destory_all我想销毁所有当前用户的任务。

但是当我点击:

<%= link_to "delete all", { controller: 'tasks', action: 'destroy_all'}, method: 'delete' %> 

没有发生。用户仍然有他所有的任务。从服务器控制台

登录:

Started DELETE "/tasks/destroy_all" for 127.0.0.1 at 2014-10-04 23:29:27 +0200 
Processing by TasksController#destroy_all as HTML 
    Parameters: {"authenticity_token"=>"fVPDi6bczNXlfhjCDI4pJhMUm3cjv6TN1Ny/ulUO4YQ="} 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY "users"."id" ASC LIMIT 1 
Redirected to http://localhost:3000/ 
Completed 302 Found in 31ms (ActiveRecord: 0.2ms) 


Started GET "/" for 127.0.0.1 at 2014-10-04 23:29:27 +0200 
Processing by PagesController#home as HTML 
    User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = 2 ORDER BY "users"."id" ASC LIMIT 1 
    Task Load (0.1ms) SELECT "tasks".* FROM "tasks" WHERE "tasks"."done" = 'f' AND "tasks"."user_id" = 2 
    Rendered tasks/index.html.erb within layouts/application (2.4ms) 
    Rendered layouts/_userbar.html.erb (0.2ms) 
    Rendered layouts/_menu.html.erb (0.1ms) 
Completed 200 OK in 46ms (Views: 44.3ms | ActiveRecord: 0.3ms) 

而且的routes.rb文件

resources :tasks do 
    collection do 
     delete :destroy_all 
    end 
    end 

编辑:我更新的日志和的link_to方法和我说的routes.rb文件。

+0

您是否在日志中看到任何错误或警告? – 2014-10-04 15:55:24

+0

没有错误,我可以识别。我添加了日志片段。 – Jensky 2014-10-04 16:00:11

回答

4

首先,您的任务表需要字段“user_id”,而不是“users_id”。这可能会立即解决您的问题。

但是,你错过了has_many的力量!只是这样做:

current_user.tasks.destroy_all 

呼唤“current_user.tasks”获取用户的任务清单给你,然后你可以呼吁他们为我做了以上“消灭”。这是更清洁,更易于阅读。

我希望这有助于!

+0

感谢有关_has_many_权力的建议,但它尚未解决我的问题。它仍然是一样的。我将'user_id'改为'user_id'。我点击'delete_all'链接并没有发生任何事情。服务器日志也是一样的。 – Jensky 2014-10-04 16:21:20

+0

服务器日志不会*完全相同,因为表已更改。至少,字段名称会有所不同。也许你应该发布更新的日志数据。 – 2014-10-04 17:05:50

+0

我已更新日志。 – Jensky 2014-10-04 18:45:09

0

根据您的模式,users_idString,它可能是"1""2"。但current_user.idInteger可能是12

在这种情况下,您将在ActiveRecord中找不到任何内容,因为它会查询ID为字符串的项目,而实际上您会发送一个整数。

这样尝试:

Task.destroy_all(users_id: current_user.id.to_s)

相匹配的类型。

==============================

然而,你的结构复杂,这将是很难保持未来。我建议你做到以下几点:

  1. Task模式,改变users_iduser_id,因为它只属于一个用户。
  2. user_id的类型更改为整数,因为它的格式为id,逻辑上它只包含数字值。
  3. 正如海梅建议的那样,在has_many中使用导轨约定并编写一些类似current_user.tasks.delete_all的内容,以保持代码清洁和更具可读性。
+0

感谢您提供真正有用的建议,但这不是主要问题。因为我摧毁了行动,它行得通。当然,我尝试了你的解决方案,但没有改变。也许你知道我该如何调试以获得有关该问题的更多信息? – Jensky 2014-10-04 16:30:41

+0

尝试在链接中指定一个方法,因为它默认为GET <%= link_to“delete all”,controller:'tasks',action:'destroy_all',method :: delete%>' – 2014-10-04 16:34:37

+0

使用这种方法,您必须修改你的'route.rb'并确保':destroy_all'类似于'collection {delete:destroy_all}'或者会有路由错误 – 2014-10-04 16:36:43