创建一个像Devise的current_user这样的方法,以便在任何地方使用

时间:2013-10-05 04:51:42

标签: ruby-on-rails ruby methods

我允许我的用户拥有多个配置文件(用户拥有多个配置文件),其中一个是默认设置。在我的用户表中,我有一个default_profile_id。

如何创建像我在其他地方可以使用的Devise的current_user这样的“default_profile”?

我应该把这条线放在哪里?

default_profile = Profile.find(current_user.default_profile_id)

3 个答案:

答案 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