2016-06-24 11 views
1

私はユーザがゲストUserとしてサインアップして私のサービスを試してみることができるRails 5アプリを持っています。各User(およびゲストユーザ)は、多くの場合、Appを持つことができます。関係は次のようになります。Rails:dependent::destroyは再割り当て後でもレコードを削除します

# User.rb 
has_many :apps, dependent: :destroy 

# App.rb 
belongs_to :user 

私が欲しいときにゲストユーザがサービスにサインアップすることを決定する:

  • (1)新しい現在のユーザーにゲストユーザのアプリ(複数可)を再割り当て。
  • (2)古いゲストユーザーを削除します(アプリケーションを削除せずに)。

私がいる問題は、アプリが古いゲストユーザを削除する前に、私は(私はデバイスの宝石を使用して)私の新しいcurrent_userapp.userを再割り当てしても削除されますということです。これが起こっているか、私が間違ってやっている理由について

# POST /resource 
def create 
    user_params = params[:user] 
    new_user_from_guest = guest_user 
    build_resource(sign_up_params) 
    resource.save 
    yield resource if block_given? 
    if resource.persisted? 
    if resource.active_for_authentication? 
     set_flash_message :notice, :signed_up if is_flashing_format? 
     sign_up(resource_name, resource) 

     # Reassigns the app 
     reasign_app_for_user(new_user_from_guest) 

     Mailer.deliver_welcome_message(current_user).deliver_later! 
     respond_with resource, location: after_sign_up_path_for(resource) 

     # delete the guest user (this also deletes the app) 
     delete_guest_user! 
    else 
     [...] 
    end 
    else 
    [...] 
    end 
end 

# ... my private methods for deleting the current user and reassigning the app's owner. 
def reasign_app_for_user(user) 
    user.apps.each do |app| 
    app.user = current_user 
    app.save! 
    end 
end 

# ... this method deletes the app, even if it is called after the reassign method. 
def delete_guest_user! 
    guest_user(with_retry = false).try(:destroy) 
    session[:guest_user_id] = nil 
end 

任意のアイデア:私のclass Users::RegistrationsController < Devise::RegistrationsController

は、私はこのようなcreateアクション(関連部分)をオーバーライド?

更新

これは後に提出するなどの方法を私のuser_params変数外観です:

<ActionController::Parameters {"name"=>"Test user", "email"=>"[email protected]", "password"=>"testing"} permitted: false> 

をし、これがどのようにsign_up_params外観です:私は前にアプリケーションを複製検討する

{"email"=>"[email protected]", "password"=>"testing", "name"=>"Test"} 
+0

あなたは 'guest_user'と' current_user'が同じでないことを確認していますか? – Aleksey

+0

'sign_up_params'と' params [:user] 'を表示できますか? –

+0

保存を使用すると!それはエラーを消す。感嘆符を削除してみてください。また、コードにブレークポイントを配置すると便利です。一度これを学ぶと、デバッグは一見ではありません。 –

答えて

1

それらを新しいユーザーに割り当てます。この方法では、それが同じアプリかどうかについて混乱はありません。

guest.apps.each do |app| 
    current_user.apps << app.dup 
end 

このように単純になります。シャベル演算子は、新しい複製されたアプリがcurrent_userオブジェクトに保存されることを保証します。

たり、よりシンプルかつコンパクト:

current_user.apps = guest.apps.map(&:dup) 
current_user.save 
関連する問題