我允许我的用户拥有多个配置文件(用户拥有多个配置文件),其中一个是默认设置。在我的用户表中,我有一个default_profile_id。
如何创建像我在其他地方可以使用的Devise的current_user这样的“default_profile”?
我应该把这条线放在哪里?
default_profile = Profile.find(current_user.default_profile_id)
答案 0 :(得分:8)
Devise的current_user方法如下所示:
def current_#{mapping}
@current_#{mapping} ||= warden.authenticate(:scope => :#{mapping})
end
如您所见,@current_#{mapping}
正在被记忆。在你的情况下,你想要使用这样的东西:
def default_profile
@default_profile ||= Profile.find(current_user.default_profile_id)
end
关于在任何地方使用它,我将假设您想在控制器和视图中使用它。如果是这种情况,您可以在ApplicationController中声明它,如下所示:
class ApplicationController < ActionController::Base
helper_method :default_profile
def default_profile
@default_profile ||= Profile.find(current_user.default_profile_id)
end
end
helper_method
将允许您在视图中访问此memoized default_profile。在ApplicationController
中使用此方法可以让您从其他控制器中调用它。
答案 1 :(得分:3)
您可以通过在方法内部定义将此代码放在应用程序控制器中:
class ApplicationController < ActionController::Base
...
helper_method :default_profile
def default_profile
Profile.find(current_user.default_profile_id)
rescue
nil
end
...
end
并且,可以像应用程序中的current_user一样访问它。如果您调用default_profile,它将为您提供配置文件记录(如果可用),否则为nil。
答案 2 :(得分:1)
我会向用户添加方法profile
或定义has_one
(首选)。如果你想要默认的配置文件,那么它只是current_user.profile
:
has_many :profiles
has_one :profile # aka the default profile
我不会实现快捷方法,但你想要:
class ApplicationController < ActionController::Base
def default_profile
current_user.profile
end
helper_method :default_profile
end