如何在Rails应用程序的视图/布局中显示部分中外键的其他字段



我正在Rails应用程序中开发导航栏。该应用程序的用户可以是多个组织的成员。我正试图建立一个";上下文切换";菜单,在那里他们可以选择要查看的组织,这样他们就可以专注于该组织中的内容。结构如下:

  1. users表:有一个id和一个display_name
  2. organizations表:具有一个id和一个organization_name
  3. 链接的user_organizations表用户和组织

users表中,有一个字段current_organization_id,它是organizations表中组织的外键。为了使current_organization_id有效,用户/组织关系必须存在于user_organization中。好吧,这就是上下文。接下来是问题。

现在在应用程序的导航栏中,我可以很好地显示current_user.current_organization_id。但它只是一个id,比如5,对用户没有帮助。我真的很难真正展示对应于current_organization_idorganization_name

views/layouts/_header.html

<header>
<nav style="display: flex; justify-content: center; align-items: center;">
<div style="flex-direction:row; display:flex;">
<a href="/">
App Name
</a>
<% if current_user.nil? %>
<%= link_to new_user_session_path do %>Sign In<% end %>
<%= link_to new_user_registration_path do %>Sign Up<% end %>
<% else %>
<%= link_to "My Organizations", organizations_path %>
<%= link_to "Edit Account", edit_user_registration_path %>
<%= link_to destroy_user_session_path, method: :delete do %>Log Out<% end %>
<%= current_user.current_organization_id.organization.organization_name%>
<% end %>
</div>
</nav>
</header>

views/layouts/application.html.erb

<!DOCTYPE html>
<html>
<head>
<title>AppName</title>
<meta name="viewport" content="width=device-width,initial-scale=1">
<%= csrf_meta_tags %>
<%= csp_meta_tag %>
<%= stylesheet_link_tag 'application', media: 'all', 'data-turbolinks-track': 'reload' %>
<%= javascript_pack_tag 'application', 'data-turbolinks-track': 'reload' %>
</head>
<body>
<%= render partial: "layouts/header", locals: {organization: @organization} %>
<p class="notice"><%= notice %></p>
<p class="alert"><%= alert %></p>
<%= yield %>
</body>
</html>

以下是我尝试过的:

执行<%= current_user.current_organization_id.organization.organization_name %>不起作用。我还尝试过将organization作为导航栏部分的局部变量传入,如下所示:<%= render partial: "layouts/header", locals: {organization: @organization} %>,但这也没有帮助。有什么想法吗?谢谢

有人帮我弄明白了这一点,所以我想我应该在这里发布答案。我将其添加到我的用户模型中。

型号/用户.rb

def current_organization
@current_organzation ||= Organization.find_by!(id: current_organization_id).organization_name
end

然后把我的标题部分改成了这行。views/layouts/_header.html

<%= current_user.current_organization %>

最新更新