我已经看到了这个类似问题的其他链接,但它们似乎都不适合我的情况。
我的更新操作是在mysql数据库中创建新记录
我的应用包含3个型号
FashionModel
ModelProfile
和Measurement
它们的定义如下:
class FashionModel < ActiveRecord::Base
has_secure_password
has_one :model_profile
has_one :measurement
accepts_nested_attributes_for :model_profile
accepts_nested_attributes_for :measurement
end
class ModelProfile < ActiveRecord::Base
belongs_to :fashion_model
end
class Measurement < ActiveRecord::Base
belongs_to :fashion_model
end
fashion_model_controller.rb
如下:
class FashionModelsController < ApplicationController
def new
@fashion_model = FashionModel.new
end
def create
@fashion_model = FashionModel.new(fashion_models_sign_up_params)
if @fashion_model.save
flash[:success] = "Welcome to Meriad"
session[:fashion_model_id] = @fashion_model.id
redirect_to edit_fashion_model_path(@fashion_model)
else
render 'new'
end
end
def edit
@fashion_model = FashionModel.find(params[:id])
@fashion_model.build_model_profile
@fashion_model.build_measurement
end
def update
@fashion_model = FashionModel.find(params[:id])
if @fashion_model.update(fashion_models_edit_params)
flash[:success] = "Saved!"
redirect_to fashion_model_path(@fashion_model)
else
render 'edit'
end
end
def show
@fashion_model = FashionModel.find(params[:id])
end
end
fashion_model_edit_params
def fashion_models_edit_params
params.require(:fashion_model).permit(:first_name,
:last_name,
:email,
:password,
model_profile_attributes: [:id,
:location,
:bio, :gender,
:phone_number,
:rate,
:profile_image,
:birthdate],
measurement_attributes: [:id,
:feet,
:inches,
:bust,
:waist,
:hips,
:dress,
:shoes,
:hair,
:eyes])
end
我想要这些内容:
时装模特通过new.html.erb
(存储在fashion_models
表格中)注册到应用程序
index.html.erb
包含所有fashion_models
的列表,其中包含编辑信息的选项(更新其个人资料)
edit.html.erb
包含model_profiles
表中的字段以及measurements
表,两者都具有fashion_models
表的外键。< / p>
我的fashion_models/new.html.erb
模板非常简单,包含first_name
,last_name
,email
,password
。
我的fashion_models/edit.html.erb
模板类似于:
<%= form_for @fashion_model do |f| %>
# fashion_model fields here
<%= f.fields_for :model_profile do |t| %>
# model_profile fields here
<% end %>
<%= f.fields_for :measurement do |t| %>
# measurement fields here
<% end %>
<% end %>
现在,每当我编辑fashion_model/:id
时,model_profile
和measurement
都会在数据库中创建新记录,而不是更新现有记录。此外,当我在Edit Profile
页面上时,没有任何字段预先填充现有数据。我必须再次手动输入所有数据。
首先,我认为这是因为build
方法,但当我删除它们时,fields_for
不会显示。
感谢任何帮助!
答案 0 :(得分:1)
你可能会弄乱他们的路线。
它的工作原理如下:
form_for
来电@fashion_model.new_record?
IF True:它会提交给POST /fashion_model
,并创建一个对象。
IF False:它将提交至PUT /fashion_model/:id
,并更新对象。
如您所见,它只取决于对象是否已存在于数据库中。因此,请再次检查您使用form_for
的位置以及传递的对象。
有关路线的问题,请参阅:http://guides.rubyonrails.org/routing.html
答案 1 :(得分:0)
所以我终于想出办法来做到这一点。希望它可以帮到某人。
我的问题是我在一个fields_for
内有2个form_for
,我需要更新这些表格的2个模型。
我厌倦了使用after_action :create_model_profile
和after_action :create_measurement
等回调。在这两种方法中,我都尝试将fashion_model_id
保存为新创建的:id
的{{1}}。
但由于回调被认为是代码味道,我想要一个更好的解决方案。
我没有创建fashion_model
,而是编写了一个如下的辅助方法
form_for @fashion_models
在我的# app/helpers/form_helper.rb
module FormHelper
def setup_fashion_model(fashion_model)
fashion_model.model_profile ||= ModelProfile.new
fashion_model.measurement ||= Measurement.new
fashion_model
end
end
中,我使用了类似
form_for
如果它没有在数据库中保留,则会创建form_for(setup_fashion_model(@fashion_model)) do |f|
...
end
和ModelProfile
的新实例。
它当然解决了预先填充包含数据的字段的问题。
就是这样。简单的解决方案,但我一直在那里挠挠脑袋。 希望能帮助到你。