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控制台日志:

console error message

非常难倒为什么它不工作。这可能是与参数有关吗?

这里是日志文件,当我提交表单:

enter image description here

+0

你试过'interest_attributes:[:hobby]'? –

+0

是的,实际上它是代码中的interests_attributes:[:hobby],我不知道为什么当我在这里发布时,它显示在interests_attributes [:hobby] – MLZ

+0

而不是'@interests = @ person.interests.new'尝试'@interests = @ person.interests.build'? –

我发现了一个有效的解决方案在我的兴趣模型添加此填充:

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