我有两个不同的表,一个Team
表和一个Project
表。每个表都有一个TeamType
表的外键。我正在使用一种表格填充使用collection_select
选择要具有外键的团队类型的每个表。这非常适合Team
表,但是当我尝试填写Project
表的表单时,即使模型和迁移是结构化的,也会给我一个错误,提示“团队类型必须存在”几乎一样。这里可能是什么问题?
这是我的迁移:
class CreateProjects < ActiveRecord::Migration[5.1]
def change
create_table :projects do |t|
t.references :team_type, foreign_key: true
t.string :project_name
t.timestamps
end
end
end
class CreateTeams < ActiveRecord::Migration[5.1]
def change
create_table :teams do |t|
t.references :team_type, foreign_key: true
t.string :team_name
t.integer :num_of_students
t.timestamps
end
end
end
这是我的模特:
class Project < ApplicationRecord
validates :project_name, length: {maximum: 35}, presence: true
belongs_to :team_type
# add_index :team
end
class Team < ApplicationRecord
validates :team_name, length: {maximum: 40}, presence: true
belongs_to :team_type
# add_index :team_name
end
以下是Project
和Team
的HTML格式:
<div class="field">
<%= form.label :team_type_id %>
<%= collection_select(:project, :team_type_id, TeamType.all,:id,:type_name) %>
</div>
<div class="field">
<%= form.label :team_type_id %>
<%= collection_select(:team, :team_type_id, TeamType.all,:id,:type_name) %>
</div>
以下是控制器:
class ProjectsController < ApplicationController
before_action :set_project, only: [:show, :edit, :update, :destroy]
# GET /projects
# GET /projects.json
def index
@projects = Project.all
end
# GET /projects/1
# GET /projects/1.json
def show
end
# GET /projects/new
def new
@project = Project.new
end
# GET /projects/1/edit
def edit
end
# POST /projects
# POST /projects.json
def create
@project = Project.new(project_params)
respond_to do |format|
if @project.save
format.html { redirect_to @project, notice: 'Project was successfully created.' }
format.json { render :show, status: :created, location: @project }
else
format.html { render :new }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /projects/1
# PATCH/PUT /projects/1.json
def update
respond_to do |format|
if @project.update(project_params)
format.html { redirect_to @project, notice: 'Project was successfully updated.' }
format.json { render :show, status: :ok, location: @project }
else
format.html { render :edit }
format.json { render json: @project.errors, status: :unprocessable_entity }
end
end
end
# DELETE /projects/1
# DELETE /projects/1.json
def destroy
@project.destroy
respond_to do |format|
format.html { redirect_to projects_url, notice: 'Project was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_project
@project = Project.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def project_params
params.require(:project).permit(:project_name, :team_id)
end
end
class TeamsController < ApplicationController
before_action :set_team, only: [:show, :edit, :update, :destroy]
# GET /teams
# GET /teams.json
def index
@teams = Team.all
end
# GET /teams/1
# GET /teams/1.json
def show
end
# GET /teams/new
def new
@team = Team.new
end
# GET /teams/1/edit
def edit
end
# POST /teams
# POST /teams.json
def create
@team = Team.new(team_params)
respond_to do |format|
if @team.save
format.html { redirect_to @team, notice: 'Team was successfully created.' }
format.json { render :show, status: :created, location: @team }
else
format.html { render :new }
format.json { render json: @team.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /teams/1
# PATCH/PUT /teams/1.json
def update
respond_to do |format|
if @team.update(team_params)
format.html { redirect_to @team, notice: 'Team was successfully updated.' }
format.json { render :show, status: :ok, location: @team }
else
format.html { render :edit }
format.json { render json: @team.errors, status: :unprocessable_entity }
end
end
end
# DELETE /teams/1
# DELETE /teams/1.json
def destroy
@team.destroy
respond_to do |format|
format.html { redirect_to teams_url, notice: 'Team was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_team
@team = Team.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def team_params
params.require(:team).permit(:team_type_id, :team_name, :num_of_students)
end
end
感谢您的帮助,谢谢!