首页 > 解决方案 > Rails:在rails服务器中加载部分对象但不渲染

问题描述

我正在尝试在show.html.erb文件中为一个名为“团队”的对象渲染一个名为“标志”的对象的部分内容。但是,不会渲染团队的分配和升起标志的部分。

我遇到了问题,因为这是一个复杂的关联。一面旗帜可以由一个团队升起,但分配给另一个团队。这是通过使用 aassignedto_id和 a来引用的raisedby_id。这些 ID 是team_id在创建标志对象时使用的。两者都是belongs_to 关联。然后,一个团队可以向他们举起许多旗帜,并为他们分配许多旗帜。我希望展示分配给团队的旗帜。

我怎样才能得到这个渲染?是否必须将任何内容添加到teams_controller.rb文件中?

请看下面的代码。

标志.rb

class Flag < ApplicationRecord
  belongs_to :raisedby, :class_name => 'Team'
  belongs_to :assignedto, :class_name => 'Team'
  belongs_to :user

  enum priority: [:high, :medium, :low]
  enum status: [:raised, :open, :closed, :cancelled]
  validate :check_assigned_and_raised

def check_assigned_and_raised
  errors.add(:assignedto_id, " error has occurred. The assigned team can not be the same as team who is raising the flag.") if assignedto_id == raisedby_id
end

end

团队.rb

class Team < ApplicationRecord
  has_many :users
  has_many :assignedFlags, -> {where 'assignedto_id = "team_id"'}, :class_name => 'Flag', :foreign_key => 'assignedto_id'
  has_many :raisedFlags, -> {where 'raisedby_id = "team_id"'}, :class_name => 'Flag', :foreign_key => 'raisedby_id'

end

团队/show.html.erb

<p id="notice"><%= notice %></p>

<p>
  <strong>Name:</strong>
  <br>
  <%= @team.name %>
</p>
<p>
  <br>
  <strong>Description:</strong>
  <br>
  <%= @team.description %>
</p>
<br>
<strong>Users:</strong>
 <p>
  <% @team.users.each do |user| %>
  <%= render partial: 'users/user', locals: { user: user } %>
  <% end %>
  </p>
  <br>
  <strong>Assigned Flags:</strong>
    <p>
  <% @team.assignedFlags.each do |flag| %>
  <%= render partial: 'flags/flag', locals: { flag: flag } %>
  <% end %>
  </p>

    <br>
  <strong>Raised Flags:</strong>
    <p>
  <% @team.raisedFlags.each do |flag| %>
  <%= render partial: 'flags/flag', locals: { flag: flag } %>
  <% end %>
  </p>
 <br>

<%= link_to 'Edit', edit_team_path(@team) %> |
<%= link_to 'Back', teams_path %>

_flags.html.erb

<div>

<p>
  <strong>Title:</strong>
  <%= @flag.title %>
</p>

<p>
  <strong>Description:</strong>
  <%= @flag.description %>
</p>

<p>
  <strong>Priority:</strong>
  <%= @flag.priority %>
</p>

<p>
  <strong>Status:</strong>
  <%= @flag.status %>
</p>

<p>
  <strong>Raisedby:</strong>
  <%= @flag.raisedby.name %>
</p>

<p>
  <strong>Assignedto:</strong>
  <%= @flag.assignedto.name  %>
</p>

<p>
  <strong>Created By:</strong>
  <%= @flag.user.name if @flag.user  %>
  <%= @flag.user.surname if @flag.user  %>
</p>


<%= link_to 'Edit', edit_flag_path(@flag) %> |
<%= link_to 'Back', flags_path %>

</div>

Rails 服务器结果

Team Load (0.4ms)  SELECT  "teams".* FROM "teams" WHERE "teams"."id" = ? LIMIT ?  [["id", 1], ["LIMIT", 1]]
  Rendering teams/show.html.erb within layouts/application
  User Load (0.3ms)  SELECT "users".* FROM "users" WHERE "users"."team_id" = ?  [["team_id", 1]]
  Rendered users/_user.html.erb (0.7ms)
  Rendered users/_user.html.erb (0.1ms)
  Flag Load (0.5ms)  SELECT "flags".* FROM "flags" WHERE "flags"."assignedto_id" = ? AND (assignedto_id = "team_id")  [["assignedto_id", 1]]
  Flag Load (0.3ms)  SELECT "flags".* FROM "flags" WHERE "flags"."raisedby_id" = ? AND (raisedby_id = "team_id")  [["raisedby_id", 1]]
  Rendered teams/show.html.erb within layouts/application (12.3ms)
  User Load (0.5ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = ? ORDER BY "users"."id" ASC LIMIT ?  [["id", 2], ["LIMIT", 1]]
Completed 200 OK in 138ms (Views: 129.8ms | ActiveRecord: 2.0ms)

标签: ruby-on-railsrubyassociationspartials

解决方案


它没有显示,因为您需要使用flag而不是@flag,还优化了您的代码,请检查

<p>
  <strong>Title:</strong>
  <%= flag.title %>
</p>

<p>
  <strong>Description:</strong>
  <%= flag.description %>
</p>

<p>
  <strong>Priority:</strong>
  <%= flag.priority %>
</p>

<p>
  <strong>Status:</strong>
  <%= flag.status %>
</p>

<p>
  <strong>Raisedby:</strong>
  <%= flag.raisedby.name %>
</p>

<p>
  <strong>Assignedto:</strong>
  <%= flag.assignedto.name  %>
</p>

<p>
  <strong>Created By:</strong>
  <%= flag.user&.name   %>
  <%= flag.user&.surname  %>
</p>


<%= link_to 'Edit', edit_flag_path(flag) %> |
<%= link_to 'Back', flags_path %>

</div>

推荐阅读