我正在尝试使用单个表单将数据保存到不同的表中。我有两个模型。即A和B.我正在尝试使用A表单存储B的属性。我的模型是:
class A < ApplicationRecord
has_one :B
accepts_nested_attributes_for :B
end
我的B模型是:
class B < ApplicationRecord
belongs_to :A
end
我的A控制器是:
class AController < ApplicationController
def index
@a = A.all
end
def new
@a = A.new
end
def create
@a = A.new(a_params)
@a.b.build
if @a.save
redirect_to a_path
else
render 'new'
end
end
private
def a_params
params.require(:a).permit(:name, :age, :address :b => [:fname, :phone])
end
end
我的new.html.erb是:
<%= form_for(:a, url: a_path) do |f| %>
<div class="field">
<%= f.label :name %>
<%= f.text_field :name%>
</div>
<div class="field">
<%= f.label :age %>
<%= f.text_field :age%>
</div>
<div class="field">
<%= f.label :address %>
<%= f.text_field :address%>
</div>
<%= f.fields_for :b do |f| %>
<p>
<%= f.label :fname, "father name" %><br />
<%= f.text_field :fname %>
</p>
<p>
<%= f.label :phone, "phone" %><br />
<%= f.text_field :phone %>
</p>
<% end %>
<div class="actions">
<%= f.submit %>
</div>
我无法在两个表中存储数据。即输入的数据存储在A表中但未能存储在B表中。
答案 0 :(得分:0)
有些事情似乎错了:
1)您没有正确使用强参数,它应该是
params.require(:a).permit(:name, :age, :address, :b_attributes => [:fname, :phone])
2)你可以删除
@a.b.build
b记录的关联和保存应该立即通过rails完成。
答案 1 :(得分:0)
The build method signature is different for has_one and
has_many关联的构建语法:
@a.b.build
has_one关联的构建语法:
@a.build_b # this will work
@a.b.build # this will throw error
class AController < ApplicationController
def index
@a = A.all
end
def new
@a = A.new
end
def create
@a = A.create(a_params)
@a.build_b
if @a.save
redirect_to a_path
else
render 'new'
end
end
private
def a_params
params.require(:a).permit(:name, :age, :address, :b_attributes => [:fname, :phone])
end
end
它在我的本地机器上运行良好。