0

Фактически, при сохранении он должен сохранять, но я получаю ошибку и попытался выяснить ошибку, в которой я ошибся.Ruby Nested Form

Просьба помочь мне с этой ошибкой.

Спасибо заранее.

Контроллер

def new 
    @fooditem = Fooditem.new 
    3.times { @fooditem.fooditemprices.build} 
end 

#Creating Food Items 
def create 
    @fooditem = Fooditem.new(fooditem_params) 
    if @fooditem.save 
     flash[:success] = "Food item created successfully." 
     redirect_to fooditems_path 
    else 
     render 'new' 
    end 
end 

Модель (ы)

class Fooditem < ApplicationRecord 
    has_many :fooditemprices, dependent: :destroy 
    accepts_nested_attributes_for :fooditemprices, reject_if: lambda {|attributes| attributes['price'].blank?}, allow_destroy: true 
end 

class Fooditemprice < ApplicationRecord 
    belongs_to :fooditem 

    validates :size, presence: { message: "Size must exists." } 
    validates :price, presence: { message: "Price must exists." } 
end 

данные формы

<%= f.fields_for :fooditemprices do |ftp_form| %> 
<div class="col-sm-9 row col-sm-offset-3"> 
    <div class="col-sm-3"> 
    <%= ftp_form.select :size, ["Full", "Half", "Small", "Medium", "Large"].collect { |p| [p, p] },{}, {class: "form-control"} %> 
    </div>  
    <div class="col-sm-3"> 
     <%= ftp_form.number_field :price, placeholder: "Price", class: "form-control" %> 
    </div> 
    <div class="col-sm-3">  
     <%= ftp_form.number_field :weight, placeholder: "Weight", class: "form-control" %> 
    </div>     
    <div class="col-sm-3">    
     <%= ftp_form.select :weight_in, ["Grams", "ml"].collect { |p| [p, p] },{}, {class: "form-control"} %> 
    </div> 
    </div> 
<% end -%> 

Ошибка

fooditem must exist

Params Полученное

"fooditem"=>{"name"=>"Food Item Name", 
       "bdescription"=>"Food Item description of brief", 
       "ddescription"=>"Food Item description of detailed", 
       "priority"=>"1", 
       "foodtype_id"=>"1", 
       "foodcategory_id"=>"1", 
       "fooditemprices_attributes"=>{ 
        "0"=>{"size"=>"Full", "price"=>"120", "weight"=>"200", "weight_in"=>"Grams"}, 
        "1"=>{"size"=>"Full", "price"=>"80", "weight"=>"120", "weight_in"=>"Grams"}, 
        "2"=>{"size"=>"Full", "price"=>"50", "weight"=>"60", "weight_in"=>"Grams"}}, 
       "sku"=>"", 
       "active"=>"1"}, 
       "commit"=>"Create Food Item"} 
+0

может попытаться заменить 'own_to: fooditem' на' own_to: fooditem, optional: true'? – Thanh

+0

fooditem_id является обязательным –

+0

Не могли бы вы напечатать параметры, полученные вашим контроллером, и метод 'fooditem_params' здесь?И я ничего не вижу о 'FoodItem' на ваш взгляд, только« FooditemPrices » – unkmas

ответ

2

Вы используете Rails 5, так что по умолчанию belongs_to требует объединения запись должна быть существовать.

Попробуйте добавить inverse в вашей ассоциации, как это:

class Fooditem < ApplicationRecord 
    has_many :fooditemprices, dependent: :destroy, inverse_of: :fooditem 
end 

class Fooditemprice < ApplicationRecord 
    belongs_to :fooditem, inverse_of: :fooditemprices 
end 

и он должен работать.