ruby-on-rails - Rails:一对一关系不起作用
问题描述
我正在开发一个Rails 项目,并且正在为模型和控制器使用命名空间。也就是说,子模型 (admin
和student
) 放在一个名为的目录中user
,而控制器放在一个名为 users 的目录中。
我也有admins_controller
并且分别students_controller
使用admin
模型和student
模型。这些控制器使用users
目录命名空间。
然后我有一个personal_info
模型,其中包含有关 的更多详细信息user
,例如性别、年龄、出生日期。该personal_info
表与模型具有一对一的关系user
。
这是我的代码;
个人信息模型:
class PersonalInfo < ApplicationRecord
belongs_to :user
end
用户型号:
class User < ApplicationRecord
has_secure_password
has_one :personal_info, class_name: 'PersonalInfo', dependent: :destroy
accepts_nested_attributes_for :personal_info, allow_destroy: true
end
管理员模型:
class User::Admin < User
end
管理员控制器:
class Users::AdminsController < ApplicationController
before_action :set_admin, only: [:show, :edit, :update, :destroy]
# GET /admins
# GET /admins.json
def index
@admins = User::Admin.all
end
# GET /admins/1
# GET /admins/1.json
def show
end
# GET /admins/new
def new
@admin = User::Admin.new
@admin.build_personal_info
end
# GET /admins/1/edit
def edit
end
# POST /admins
# POST /admins.json
def create
@admin = User::Admin.new(admin_params)
@admin.build_personal_info
respond_to do |format|
if @admin.save
format.html { redirect_to users_admin_path(@admin), notice: 'Admin was successfully created.' }
format.json { render :show, status: :created, location: users_admin_path(@admin) }
else
format.html { render :new }
format.json { render json: @admin.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /admins/1
# PATCH/PUT /admins/1.json
def update
respond_to do |format|
if @admin.update(admin_params)
format.html { redirect_to users_admin_path(@admin), notice: 'Admin was successfully updated.' }
format.json { render :show, status: :ok, location: users_admin_path(@admin) }
else
format.html { render :edit }
format.json { render json: @admin.errors, status: :unprocessable_entity }
end
end
end
# DELETE /admins/1
# DELETE /admins/1.json
def destroy
@admin.destroy
respond_to do |format|
format.html { redirect_to users_admins_url, notice: 'Admin was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_admin
@admin = User::Admin.find(params[:id])
end
# Only allow a list of trusted parameters through.
def admin_params
params.require(:user_admin).permit(
:email, :password, :role_id,
personal_info_attributes: [ :id, :first_name, :last_name, :phone,
:gender, :dob, :address, :city, :state,
:country ]
)
end
end
路线:
Rails.application.routes.draw do
namespace :users do
resources :admins
resources :students
end
end
_form.html.erb:
<% if @admin.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(@admin.errors.count, "error") %> prohibited this admin from being saved:</h2>
<ul>
<% @admin.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<%= fields_for :personal_info do |form| %>
<div class="field">
<%= form.label :first_name %>
<%= form.text_field :first_name %>
</div>
<div class="field">
<%= form.label :last_name %>
<%= form.text_field :last_name %>
</div>
<% end %>
<div class="field">
<%= form.label :email %>
<%= form.text_field :email %>
</div>
<%= fields_for :personal_info do |form| %>
<div class="field">
<%= form.label :phone %>
<%= form.text_field :phone %>
</div>
<% end %>
<div class="field">
<%= form.label :password %>
<%= form.text_field :password %>
</div>
<div class="actions">
<%= form.submit %>
</div>
新的.html.erb:
<h1>Editing Admin</h1>
<%= form_with(model: @admin, url: users_admins_path, local: true) do |form| %>
<%= render partial: 'form', admin: @admin, locals: { form: form } %>
<% end %>
<%= link_to 'Back', users_admins_path %>
但是,当我在向显示的表单添加输入后尝试创建新的admin
或更新现有的时,数据库中不会保存任何数据。他们都是零。admin
Personal Info
PersonalInfo Load (0.3ms) SELECT "personal_infos".* FROM "personal_infos" WHERE "personal_infos"."user_id" = $1 LIMIT $2 [["user_id", 6], ["LIMIT", 1]]
=> #<PersonalInfo id: 2, first_name: nil, last_name: nil, phone: nil, gender: nil, dob: nil, address: nil, city: nil, state: nil, country: nil, user_id: 6, created_at :“2020-06-26 13:37:16”,更新时间:“2020-06-26 13:37:16”>
我试图解决这个问题,但还没有运气。任何形式的帮助都将受到高度赞赏。
解决方案
您应该将您fields_for
的管理表单称为:
<%= form.fields_for :personal_info do |form| %>
否则,它会独立于管理员发送这些参数,而不是根据需要嵌套。
fwiw,为了更好地阅读,我会考虑重命名您的内部 personal_info 表单变量,以免与管理表单变量发生冲突。但这只是一个建议。:)
推荐阅读
- php - 在 rest API (php) 中调用 LINK
- vue.js - 如何在 VueJS 中使用 v-for ++ 单选按钮
- ruby - 我需要从另一个具有依赖关系的类中调用一个方法
- android - 检测到具有空属性的信标
- python - 如何提取具有相应时间步长的音素数据?
- scala - 如何实现从类型类到接口语法的自动转换(Cats 示例)
- database - 在 Navision 2018 CU2 数据库中检测已安装的语言
- dialogflow-es - 设置 webhook 以实现对话流的最佳方法?
- r - 使用键重新映射数据库
- sql-server - Azure 拉伸数据库突然失败