对于当前用户的同一属性,如何将 object 的默认值设置为等于当前用户的值? (Rails 4)

How do I set the default value of an object equal to the current user's value for that same attribute of the current user? (Rails 4)

我想做的事情: 让当前登录的用户 ("current_user") 创建成人 class ("adult") 的新实例,并且 - 如果 current_user 未指定孩子的数量 ( num_kids) that adult has AND current_user 指定 adult to user 的 adult.relationship 是 "husband", "wife" or "partner", 那么我要设置adult.num_kids 的值等于 user.num_kids

的现有值

背景: 我有一个用户 class 和一个成人 class。一个用户 has_many 成人和一个成人 belongs_to 一个用户。

我在 application_controller:

中定义了一个 current_user 辅助方法
class ApplicationController < ActionController::Base
    protect_from_forgery with: :exception
    helper_method :current_user

    private 
    def current_user
        current_user ||= User.find(session[:user_id]) if session[:user_id]
    end
end

在我的 Adults Controller / create 函数中,我有一行: @adult.user_id = current_user.id

这很好用,我可以创建成人并正确引用成人 belongs_to.

在我的成人模型中,我有:

class Adult < ActiveRecord::Base
    has_many :kids
    belongs_to :user

    after_initialize :defaults
    after_create :defaults_shared_info

    def defaults
        self.vacation_days ||= '10'
    end         

    def defaults_shared_info
        if ['husband', 'wife', 'partner'].any? { self.relationship }
            self.num_kids ||= User.find(self.user_id).num_kids
        else
        end
    end
end

默认设置vacation_days = 10即可。

然而,成人的 num_kids 到用户的 num_kids 的设置没有,我最终得到 adult.num_kids = nil

我已经确认 user.num_kids = 2 ,所以这不是问题。

当我把代码改成

    def defaults_shared_info
        if ['husband', 'wife', 'partner'].any? { self.relationship }
            self.num_kids ||= current_user.num_kids
        else
        end
    end

我收到错误消息 "undefined local variable or method `current_user'"

我最初尝试不区分 after_initialize 和 after_create,并将所有代码放在 after_initialize:默认值

这也给出了同样的错误"undefined local variable or method `current_user'"

我很困惑为什么,如果我可以参考 current_user.id 创建 Adult 的实例,上面的代码就不起作用。

通过将 after_create 更改为 before_create,我成功了。

感谢在这里发帖的人: