4

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

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

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

default_profile = Profile.find(current_user.default_profile_id)
4

3 回答 3

9

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将允许您在视图中访问这个记忆的 default_profile。有这个方法ApplicationController允许你从你的其他控制器调用它。

于 2013-10-05T05:23:26.387 回答
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,它将为您提供配置文件记录(如果可用),否则为零。

于 2013-10-05T04:54:26.533 回答
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
于 2013-10-05T08:04:09.423 回答