创建用于检查对象的rails方法(如果存在)

时间:2015-09-14 20:43:25

标签: ruby-on-rails model-view-controller methods

我在我的rails应用程序中使用Devise进行身份验证,并且在我的布局文件夹中有一个_header部分用于导航栏。我想在那里放置一个创建配置文件的链接(用户模型创建w / devise,用户has_one配置文件和配置文件belongs_to用户)但仅当用户配置文件尚未存在时。 我想为此创建一个方法并将if语句放入视图中,但我无法弄清楚创建方法的位置以及它的外观。

基本设计方法在检查用户是否已登录时工作正常。我想要一种类似的方法来检查用户配置文件是否存在。

布局/ _header.html.erb

<% if user_signed_in? %>
    <% if user.profile(current_user) %>
        <li><%= link_to "Create Profile", new_user_profile_path(current_user) %></li>

所以我的问题: 在哪里放置方法(helper / controller / model / appcontroller / etc.)? 该方法的外观如何?

2 个答案:

答案 0 :(得分:1)

您可以在助手文件(app/helpers/)中对其进行定义。您可以使用application_helper但为了更好的一致性,我们会将此文件命名为users_helper

# app/helpers/users_helper.rb
module UsersHelper
  def user_has_profile?(user = current_user)
    return false unless user.present?
    Profile.where(user_id: user.try(:id) || user).exists?
  end
end

并像这样使用它:

# any view
<% if user_signed_in? && !user_has_profile? %>

答案 1 :(得分:0)

我会将它作为一个名为has_profile的方法放在helpers目录(app / helpers / application_helper.rb)中?

该方法看起来像

def has_profile?
  current_user.profile.present?
end

然后在你看来:

<% if user_signed_in? && has_profile? %>
        <li><%= link_to "Create Profile", new_user_profile_path(current_user) %></li>