2013-07-23 26 views
2

我在尝试在Hartl的Ruby on Rails教程中实现示例应用程序时遇到了一个奇怪的问题。RoR教程Michael Hartl删除Microposts也删除用户

当我删除微柱,将发生以下情况:

  1. 的微柱被删除。
  2. 该用户也被删除。
  3. 指示注册页面。

只有第一步应该发生。用户不应该被删除。当我删除微博时,控制台跟踪显示以下内容:

Started DELETE "/microposts/1" for 127.0.0.1 at 2013-07-23 11:35:31 -0400 
Processing by MicropostsController#destroy as HTML 
    Parameters: {"authenticity_token"=>"clfdQ1F/1ewiDnuae9OpVXSZ3S/wtieCrVYNM+Y1838=", "id"=>"1"} 
    User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."remember_token" = 'cUs3NX6FrzU-XnkCbGE4wg' LIMIT 1 
    Micropost Load (1.0ms) SELECT "microposts".* FROM "microposts" WHERE "microposts"."user_id" = 1 AND "microposts"."id" = 1 ORDER BY microposts.created_at DESC LIMIT 1 
    (0.0ms) begin transaction 
    SQL (2.0ms) DELETE FROM "microposts" WHERE "microposts"."id" = ? [["id", 1]] 
    User Load (0.0ms) SELECT "users".* FROM "users" WHERE "users"."id" = 1 LIMIT 1 
    SQL (1.0ms) DELETE FROM "users" WHERE "users"."id" = ? [["id", 1]] 
    (12.0ms) commit transaction 
Redirected to http://localhost:3000/ 
Completed 302 Found in 27ms (ActiveRecord: 16.0ms) 

我不知道为什么DELETE FROM“users”正在发送。

我的application.js文件看起来像这样:

//= require jquery 
//= require jquery_ujs 
//= require bootstrap 
//= require_tree . 

我的routes.rb看起来是这样的:

SampleApp::Application.routes.draw do 

    resources :users 
    resources :sessions, only: [:new, :create, :destroy] 
    resources :microposts, only: [:create, :destroy] 

    root :to => 'static_pages#home' 
    match '/signup', to: 'users#new' 
    match '/signin', to: 'sessions#new' 
    match '/signout', to: 'sessions#destroy', via: :delete 
    match '/help', to: 'static_pages#help' 
    match '/about', to: 'static_pages#about' 
    match '/contact', to: 'static_pages#contact' 
end 

而且microposts_controller.rb看起来是这样的:

class MicropostsController < ApplicationController 

    before_filter :signed_in_user, only: [:create, :destroy] 
    before_filter :correct_user, only: :destroy 

    def create 
    @micropost = current_user.microposts.build(params[:micropost]) 
    if @micropost.save 
     flash[:success] = "Micropost created!" 
     redirect_to root_path 
    else 
     @feed_items = [] 
     render 'static_pages/home' 
    end 
    end 

    def destroy 
    @micropost.destroy 
    redirect_back_or root_path 
    end 

    private 

    def correct_user 
    @micropost = current_user.microposts.find_by_id(params[:id]) 
    redirect_to root_path if @micropost.nil? 
    end 
end 

您可以在上面看到如何执行destroy操作(如教程中指定的那样)。所以我不确定问题是什么。

这里是应用程序/模型/ micropost.rb

class Micropost < ActiveRecord::Base 
    # here we removed :user_id from attr_accessable for security reasons 
    attr_accessible :content 
    belongs_to :user, dependent: :destroy 

    validates :content, presence: true, length: { maximum: 140 } 
    validates :user_id, presence: true 

    default_scope order: 'microposts.created_at DESC' 
end 

欣赏任何帮助。

+1

你的'app/models/micropost.rb'看起来像什么? –

+0

谢谢你看这马立克。我在上面添加了micropost.rb的代码。在教程中解释了dependent::destroy,以便在用户被删除时删除属于该用户的所有微博。 –

+1

@AbeChallah,如果你想删除属于用户的所有微博,那么你应该在'User.rb'中加入'dependent::destroy',就像'has_many:microposts,dependent :: destroy' – vee

回答

2

问题出在您的Micropost型号上。下面的行删除与Micropost相关的user

belongs_to :user, dependent: :destroy 

替换符合:

belongs_to :user 

,你不会看到相关的用户越来越删除。

请通过对“相关协会”这里的文档阅读:http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

更新:

如果你想删除属于用户的所有微柱,那么你应该在User.rb添加dependent: :destroy类似如下:

has_many :microposts, dependent: :destroy 
+0

太棒了。有用。 –

+0

@AbeChallah,看看我在你的问题中的评论。 – vee

+0

我做过维诺。非常感谢。 –

0

你的Micropost类是说用户应该被销毁时,微型ost被belongs_to :user上的dependent: :destroy选项破坏。

documentation for belongs_to对于:dependent如果设置为:destroy,则关联的对象在此对象时被销毁。

所以,如果你删除dependent: :destroy你不会得到这个问题。

+0

我测试了它,它工作。感谢您的信息。 –

相关问题