2013-07-23 3 views
2

Hartl의 Ruby on Rails 튜토리얼에서 샘플 앱을 구현하는 동안 이상한 문제가 발생했습니다. 나는 micropost를 삭제하면RoR Tutorial Michael Hartl Microposts를 삭제해도 사용자가 삭제됨

, 다음과 같은 상황이 발생합니다

  1. micropost은 삭제됩니다.
  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) 

"사용자"의 삭제 이유가 확실하지 않습니다.

내 application.js 파일은 다음과 같습니다 :

내 routes.rb은 다음과 같습니다
//= require jquery 
//= require jquery_ujs 
//= require bootstrap 
//= require_tree . 

:

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 

파괴 작업이 구현되는 방법 (위의 튜토리얼에 지정된대로)을 위에서 볼 수 있습니다. 그래서 나는 그 문제가 무엇인지 모른다. 여기

앱/모델/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

이 Marek를 살펴 주셔서 감사합니다. 위의 micropost.rb 코드를 추가했습니다. 종속 : : destroy는 사용자가 삭제되면 사용자에게 속한 모든 마이크로 포스트를 삭제하는 목적을 위해 튜토리얼에서 설명되었습니다. –

+1

@AbeChallah, 사용자에게 속한 모든 마이크로 포스트를 지우고 싶다면'has_many : microposts, dependent : : destroy'처럼'User.rb'에'dependent : : destroy'를 추가해야합니다. – vee

답변

2

Micropost 모델에 문제가 있습니다.

belongs_to :user, dependent: :destroy 

과 함께 그 라인을 교체 : 다음 줄은 Micropost과 관련된 user 삭제됩니다

belongs_to :user 

당신은 관련 사용자가 삭제하기 표시되지 않습니다. http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html

업데이트 : : 사용자에 속한 모든 microposts을 삭제하려면

다음 다음과 같이 User.rbdependent: :destroy를 추가해야

여기에 "종속 협회"에 대한 설명서를 읽어 보시기 바랍니다 :

귀하의 Micropost 클래스는 사용자가 때 microp 파괴해야한다고 말하고있다
has_many :microposts, dependent: :destroy 
+0

환상적입니다. 그것은 작동합니다. –

+0

@AbeChallah, 귀하의 질문에 내 의견을 좀 봐. – vee

+0

나는 비 노드를 했어. 고마워. –

0

ost는 belongs_to :user에있는 dependent: :destroy 옵션으로 파괴되었습니다.

:dependent의 경우 documentation for belongs_to에서 :이 개체가 파괴되면 연결된 개체가 파괴됩니다.

따라서 dependent: :destroy을 제거하면 문제가 발생하지 않습니다.

+0

테스트를 거쳤습니다. 정보 주셔서 감사합니다. –

관련 문제