嵌套表单不保存



我是新手做rails和MVC。我正在尝试将我使用简单形式和嵌套表单 for gem 制作的嵌套表单保存到我的数据库中。当我提交表单时,仅创建并保存"父"模型。非常感谢。

"父模型":

class Diet < ApplicationRecord
    belongs_to :coach
    has_many :user_eat_diets
    has_many :user, through: :user_eat_diets
    accepts_nested_attributes_for :user_eat_diets
    has_many :diet_composes
    has_many :foods, through: :diet_composes
    accepts_nested_attributes_for :diet_composes
end

"儿童"模型:

class DietCompose < ApplicationRecord
    belongs_to :diet
    belongs_to :food
end

"父"控制器:

class DietsController < ApplicationController
    def new
        @diet = Diet.new
        @diet.diet_composes.build
    end
    def create
        @diet = Diet.new(diet_params)
        if @diet.save
            flash[:success] = "success"
        end
    end
    def diet_params
      params.require(:diet).permit(:name, :coach_id, :diet_composes_attributes)
    end
end

"子"控制器:

class DietComposesController < ApplicationController
    def new
        @diet_compose = Diet_compose.new
    end
    def create
        @diet_compose = Diet_compose.new(diet_compose_params)
        if @diet_compose.save
            flash[:success] = "success"
        end
    end
    def diet_compose_params
      params.require(:diet_compose).permit(:quantity, :hour, :day, :food_id, :diet_id)
    end
end

窗体视图:

<%= simple_form_for @diet, :html => {:class => 'form-basic' }  do |f| %>
            <%= f.input :name %>
            <%= f.input :coach_id %>
            <%= f.nested_fields_for :diet_composes do |ff| %>
                    <%= ff.remove_nested_fields_link %>
                    <%= ff.input :hour %>
                    <%= ff.input :day %>
                    <%= ff.input :food_id %>
                    <%= ff.input :diet_id %>
                <% end %>
            <%= f.add_nested_fields_link :diet_composes %>
            <%= f.button :submit %>
        <% end %>

另外,当我执行命令时

Diet_compose.全部

在轨道控制台上我收到错误

加载

错误:无法自动加载常量Diet_compose,预期 /home/tanaka/Desktop/E-xercite/app/models/diet_compose.rb 来定义它 来自 (IRB):8

您需要在此处更正多个内容。我已经添加了内联注释。

Diet模型中 ( diet.rb

class Diet < ApplicationRecord
  attr_accessible :diet_composes # make the attributes accessible for mass assignment.
end

在控制器中:

class DietsController < ApplicationController
    def new
        @diet = Diet.new
        @diet.diet_composes.build
    end
    def create
        @diet = Diet.new(diet_params)
        if @diet.save
            flash[:success] = "success"
        end
    end
    def diet_params
       # add attributes of nested association to whitelist
      params.require(:diet).permit(:name, :coach_id, :diet_composes_attributes => [:hour, :day, :food_id, :diet_id])
    end
end

你真的不需要DietComposesController 的操作来让你的嵌套属性Diet工作。但是,纠正下面的错误,这给了你LoadError

class DietComposesController < ApplicationController
    def new
        @diet_compose = DietCompose.new # Model name is always CamelCase. DietCompose rather than Diet_compose
    end
    def create
        @diet_compose = DietCompose.new(diet_compose_params) # here as well
        if @diet_compose.save
            flash[:success] = "success"
        end
    end
    def diet_compose_params
      params.require(:diet_compose).permit(:quantity, :hour, :day, :food_id, :diet_id, )
    end
end

您的命令应DietCompose.all 。甚至看看diet_model.rb的定义.它将名称声明为 DietModel

你的观点似乎很好。我没有使用过nested_form_fields宝石,所以不能 100% 确定。简单的调试规则,查看 rails 服务器的日志并推断:)

最新更新