无法显示用户名

时间:2019-02-22 09:44:05

标签: ruby-on-rails

我正在开发一个Rails应用程序,其中有两个模型:用户模型和团队模型。团队应该有一个captain_id,实际上是一个user_id,是通过具有一个关联实现的。现在我的问题是,在创建团队时,我无法在团队的显示页面上显示队长的姓名。

这是我的模型定义:

class Team < ApplicationRecord
    has_one   :captain, class_name: 'User' , foreign_key: 'captain_id'
    has_many  :users, dependent: :destroy

    validates :ground_name, presence:true 
    validates :team_name, presence:true 
    validates :captain_id, presence:true ,uniqueness: true
end


class User < ApplicationRecord       
      belongs_to :team,optional: true
end

这是我的表演视图:

<table class="table table-striped">
  <tr>
    <th>Id</th>
    <th>Team Name</th>
    <th>Ground Name</th>
    <th>Captain Name</th>
    <th>Manage</th>
  </tr>
  <% @team.each do |f| %>
  <tr>
    <td><%= f.id  %></td>
    <td><%= f.team_name %></td>
    <td><%= f.ground_name %></td>
    <td><%= f.captain_id&.first_name %></td>
  </tr>
  <%end%>
</table>

这会产生错误:

  

2的未定义方法“ first_name”:整数

这是我的数据库架构:

ActiveRecord::Schema.define(version: 2019_02_19_090032) do

  create_table "teams", force: :cascade do |t|
    t.string "team_id"
    t.string "team_name"
    t.string "ground_name"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.integer "captain_id"
  end

  create_table "users", force: :cascade do |t|
    t.string "first_name"
    t.string "last_name"
    t.string "email"
    t.string "photo"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "encrypted_password", default: "", null: false
    t.string "reset_password_token"
    t.datetime "reset_password_sent_at"
    t.datetime "remember_created_at"
    t.integer "team_id"
    t.index ["reset_password_token"], name: "index_users_on_reset_password_token", unique: true
    t.index ["team_id"], name: "index_users_on_team_id"
  end
end

2 个答案:

答案 0 :(得分:2)

关联的用户应该在属性captain下可用。因此,您的标记应如下所示:

<td><%= f.captain&.first_name %></td>

您应该定义:has_to关系而不是:belongs_to,以便在团队表中定义外键:

belongs_to :captain, class_name: 'User', foreign_key: :captain_id

如果您在teams表中没有定义captain_id列,则必须创建一个迁移并运行它。

要创建迁移:

跟踪迁移add_captain_id_to_teams

现在您在db / migrate中有了一个新的迁移文件,类似于db/migrate/<timestamp>_add_captain_id_to_teams.rb

打开此文件并对其进行编辑,如下所示:

class AddCaptainIdToTeams < ActiveRecord::Migration[5.0]
  def change
    add_column :teams, :captain_id, :integer
  end
end

现在运行以下命令以创建列:

捆绑执行耙db:migrate

现在您可以分配队长ID并将其保存在数据库中。

答案 1 :(得分:2)

以下可以解决问题,

<td><%= f.captain&.first_name %></td>

但是您也可以使用以下内容

<td><%= f.captain.first_name %></td>

无需添加optional: true,将其删除并从team.rb中删除以下内容

validates :captain_id, presence:true ,uniqueness: true

因为我们删除了optional: true

user.rb中,需要更正,

belongs_to :team, optional: true, foreign_key: :captain_id