【问题标题】:Rails: dependent: :destroy deletes record even after reassignmentRails:dependent: :destroy 即使在重新分配后也会删除记录
【发布时间】:2016-06-24 21:30:42
【问题描述】:

我有一个 Rails 5 应用程序,用户可以在其中注册为访客 Users 以试用我的服务。每个User(和来宾用户)可以有多个Apps。关系如下所示:

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

# App.rb
belongs_to :user

当访客用户决定注册我想要的服务时:

  • (1) 将访客用户的应用程序重新分配给新的当前用户。
  • (2) 删除旧访客用户(不删除应用)。

我遇到的问题是,即使我在删除旧来宾用户之前将 app.user 重新分配给我的新 current_user(我使用设备 gem),该应用也会被删除。

在我的class Users::RegistrationsController < Devise::RegistrationsController 中,我像这样覆盖create 操作(相关部分):

# 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

关于为什么会发生这种情况或我做错了什么的任何想法?

更新

这是我的user_params 变量在提交后的样子:

<ActionController::Parameters {"name"=>"Test user", "email"=>"test@example.com", "password"=>"testing"} permitted: false>

这就是sign_up_params 的样子:

{"email"=>"test@example.com", "password"=>"testing", "name"=>"Test"}

【问题讨论】:

  • 你确定guest_usercurrent_user不一样吗?
  • 你能告诉我们sign_up_paramsparams[:user]吗?
  • 当你使用保存时!这可以消除错误。尝试删除感叹号。在代码中放置断点也很有帮助。一旦你学会了调试,就永远不会出现这种情况。
  • @Aleksey 是的,它们不一样。
  • @SergiiK 我已将其添加到我原来的问题中。

标签: ruby-on-rails ruby devise belongs-to ruby-on-rails-5


【解决方案1】:

我会考虑在将应用程序分配给新用户之前复制它们。这样,就不会混淆它是否是同一个应用程序。

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

就这样。铲子操作员确保将新的、重复的应用程序保存到 current_user 对象中。

甚至更简单、更紧凑:

current_user.apps = guest.apps.map(&:dup)
current_user.save

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-07-08
    • 2019-06-04
    • 2018-07-25
    • 2017-07-27
    • 1970-01-01
    • 2017-12-16
    • 1970-01-01
    • 2023-04-06
    相关资源
    最近更新 更多