Rails的5麻烦,节约了嵌套fields_for ..错误信息必须存在
问题描述:
我有以下型号:Rails的5麻烦,节约了嵌套fields_for ..错误信息<xxx>必须存在
class Person < ApplicationRecord
has_many :interests, dependent: :destroy
accepts_nested_attributes_for :interests
validates_presence_of :email
validates_inclusion_of :gender, :in => %w(M F), message: "Gender can only be in M or F"
has_secure_password
def name
"#{first_name} #{last_name}"
end
def interests_concatenated
interests.map { |i| i.interest }.join(", ")
end
end
class Interest < ApplicationRecord
belongs_to :person
end
我的控制器如下:
class PeopleController < ApplicationController
def index
@person = Person.all
end
def new
@person = Person.new
@person.interests.build
end
def create
@person = Person.new(people_params)
if @person.save
session[:user_id] = @person.id
redirect_to(people_path)
else
flash = "Email or gender can't be blank!"
render 'new'
end
end
private
def people_params
params.require(:person).permit(:email, :first_name, :last_name, :gender, :password,:password_confirmation, interests_attributes: [:hobby])
end
end
我的格式如下:
<%= form_for @person do |f| %>
<p>
<%= f.label :email %> <br>
<%= f.text_field :email %>
</p>
<p>
<%= f.label :first_name %> <br>
<%= f.text_field :first_name %>
</p>
<p>
<%= f.label :last_name %> <br>
<%= f.text_field :last_name %>
</p>
<p>
<%= f.label :gender %> <br>
<%= f.label(:gender_male, "Male") %>
<%= f.radio_button(:gender, "M") %> <br>
<%= f.label(:gender_female, "Female") %>
<%= f.radio_button(:gender, "F") %> <br>
</p>
<p>
<%= f.label :password %> <br>
<%= f.password_field :password %>
</p>
<p>
<%= f.label :password_confirmation %> <br>
<%= f.password_field :password_confirmation %>
</p>
<p>
<%= f.fields_for :interests do |i| %>
<%= i.label :hobby %>
<%= i.text_field :hobby %>
<% end %>
</p>
<p>
<%= f.submit %>
</p>
<% end %>
这是我在运行它时的byebug控制台日志:
非常难倒为什么它不工作。这可能是与参数有关吗?
这里是日志文件,当我提交表单:
答
我发现了一个有效的解决方案在我的兴趣模型添加此填充:
class Interest < ApplicationRecord
belongs_to :person, **optional: true**
end
由于@person未能保存每一次,最大的线索是在错误消息“利益人必须存在”,我发现this StackOverflow solution是有帮助的。此外blog post on why this is needed有助于澄清问题。
感谢大家称它!
答
相反的:
@interests = @person.interests.new
尝试
@interests = @person.interests.build
new
创造一个清新,干净,彻底空的新对象......但是build
是特殊Rails的关联方法,将适当的默认值(比如,例如右person_id
)
+0
我试过了你的建议,但我仍然得到同样的错误 – MLZ
你试过'interest_attributes:[:hobby]'? –
是的,实际上它是代码中的interests_attributes:[:hobby],我不知道为什么当我在这里发布时,它显示在interests_attributes [:hobby] – MLZ
而不是'@interests = @ person.interests.new'尝试'@interests = @ person.interests.build'? –