2017-01-19 9 views
0

У меня есть следующие модели: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

Да, на самом деле это были interest_attributes: [: hobby] в коде, я не знаю, почему он появляется в интересах_attributes [: hobby], когда я разместил здесь – MLZ

+0

Вместо '@interests = @ person.interests.new' try '@interests = @ person.interests.build'? –

ответ

0

я нашел рабочее решение, добавив это в моих интересах модели:

class Interest < ApplicationRecord 
    belongs_to :person, **optional: true** 
end 

Поскольку @person не в состоянии сохранить каждый раз, самая большая подсказка была в сообщении об ошибке «Проценты должны существовать», я нашел this StackOverflow solution, чтобы быть полезным. Также этот blog post on why this is needed был полезен в освещении проблемы.

Спасибо всем, кто взвесил его!

2

Вместо:

@interests = @person.interests.new 

попробовать

@interests = @person.interests.build 

new создает свежий, чистый, полностью пустой новый объект ... но build это специальный метод Rails ассоциации, которая будет заполнять его соответствующими по умолчанию (как, например, право person_id)

+0

Я попробовал ваше предложение, но я все равно получаю ту же ошибку – MLZ