2

Hartl の Ruby on Rails チュートリアルでサンプル アプリを実装しようとすると、奇妙な問題が発生します。

マイクロポストを削除すると、次のことが起こります。

  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

上記で、破棄アクションがどのように実装されているかを確認できます (チュートリアルで指定されているとおり)。だから私は問題が何であるか分かりません。

ここに app/models/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

これに関する助けに感謝します。

4

2 に答える 2

2

問題はMicropostモデルにあります。user次の行は、に関連付けられている を削除していMicropostます:

belongs_to :user, dependent: :destroy

その行を次のように置き換えます。

belongs_to :user

関連付けられたユーザーが削除されることはありません。

http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.htmlの「依存関係」に関するドキュメントをお読みください。

アップデート:

ユーザーに属するすべてのマイクロポストを削除する場合は、次のように追加dependent: :destroyする必要があります。User.rb

has_many :microposts, dependent: :destroy 
于 2013-07-23T16:15:52.713 に答える
0

あなたのクラスは、 のオプションでMicropostマイクロポストが破棄されたときにユーザーを破棄する必要があると言っています。dependent: :destroybelongs_to :user

:destroyに設定されている:dependent 場合、関連するオブジェクトは、このオブジェクトが破棄されたときに破棄されます。

したがって、削除してdependent: :destroyも問題は発生しません。

于 2013-07-23T16:16:29.173 に答える