Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/sharepoint/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 在上的嵌套属性上成功保存有多个,但没有';无法添加到数据库_Ruby On Rails_Ruby On Rails 4_Nested Attributes_Has Many Through - Fatal编程技术网

Ruby on rails 在上的嵌套属性上成功保存有多个,但没有';无法添加到数据库

Ruby on rails 在上的嵌套属性上成功保存有多个,但没有';无法添加到数据库,ruby-on-rails,ruby-on-rails-4,nested-attributes,has-many-through,Ruby On Rails,Ruby On Rails 4,Nested Attributes,Has Many Through,我和订单和项目系统与Rails 4和a之间有很多关联。当我选择“创建订单”时,网页显示订单已成功创建,但OrderItems链接表中未创建链接,这意味着与该订单相关的项目不会出现在订单的显示页面或编辑页面上 订单还链接到员工。当前员工ID链接到该订单。我只是不知道如何将每个项目添加到数据库中 p、 我正在使用一个名为nested_form的gem来处理前端的所有jQuery,动态添加和删除订单的_form.html.erb上的新项目 orders_controller.rb class Orde

我和订单和项目系统与Rails 4和a之间有很多关联。当我选择“创建订单”时,网页显示订单已成功创建,但OrderItems链接表中未创建链接,这意味着与该订单相关的项目不会出现在订单的显示页面或编辑页面上

订单还链接到员工。当前员工ID链接到该订单。我只是不知道如何将每个项目添加到数据库中

p、 我正在使用一个名为nested_form的gem来处理前端的所有jQuery,动态添加和删除订单的_form.html.erb上的新项目

orders_controller.rb
class OrdersController
order.rb
类顺序:订单\u项
默认范围{order('status DESC')}
验证:员工id,状态:true
验证:表号,数值性:{only_integer:true,大于:0,小于或等于:20},存在性:true
验证:客户数,数值性:{only_integer:true,大于:0,小于或等于:50},状态:true
验证:状态,包含:{in:%w(等待就绪关闭),消息:“%{value}不是状态”}
接受:order_items的_嵌套_属性,:reject_if=>lambda{a | a[:item_id]。空白?}
结束
项目1.rb
class项:订单项目
在保存{name.capitalize!}之前
有效的\u PRICE\u REGEX=/\A\d+(?:\。\d{0,2})?\z/
验证:名称,状态:true,长度:{最大值:100}
验证:price,格式:{with:VALID_price_REGEX},数值性:{大于:0,小于或等于:100},存在性:true
验证:课程,包含:{in:%w(起动器主甜点饮料),消息:“%{value}不是课程”}
验证:菜单id,状态:true
结束
order_item.rb
class OrderItem
订单/_form.html.erb



问题:假设您的订单中有许多项目,您希望在创建订单时保存这些项目

   order = Order.new(order_params)
   item = Item.new(name: 'item-name', product_info: 'etc etc')

   if order.save
    item.create
    order.items << item
   end
order=order.new(订单参数)
item=item.new(名称:“item name”,产品信息:“etc”)
如果订购,请保存
item.create

对于上面的order.items,我获得了ActiveModel::ForbiddenAttributesError on
order\u item=item.create(item)
,因为您已将order\u params方法添加到参数的白名单中。同样,也有一个类似的方法item_params&允许item属性。对于调试,可以在@order.save行之后使用raise item.inspect/raise params.inspect
class Order < ActiveRecord::Base

  belongs_to :employee
  has_many :order_items
  has_many :items, :through => :order_items

  default_scope { order('status DESC') }

  validates :employee_id, presence: true
  validates :table_number, numericality: { only_integer: true, greater_than: 0, less_than_or_equal_to: 20 }, presence: true
  validates :number_of_customers, numericality: { only_integer: true, greater_than: 0, less_than_or_equal_to: 50 }, presence: true
  validates :status, inclusion: { in: %w(Waiting Ready Closed), message: "%{value} is not a status" }

  accepts_nested_attributes_for :order_items, :reject_if => lambda { |a| a[:item_id].blank? }

end
class Item < ActiveRecord::Base
  belongs_to :menu
  has_many :order_items
  has_many :orders, :through => :order_items

  before_save { name.capitalize! }
  VALID_PRICE_REGEX = /\A\d+(?:\.\d{0,2})?\z/

  validates :name, presence: true, length: { maximum: 100 }
  validates :price, format: { with: VALID_PRICE_REGEX }, numericality: { greater_than: 0, less_than_or_equal_to: 100}, presence: true
  validates :course, inclusion: { in: %w(Starter Main Dessert Drink), message: "%{value} is not a course" }
  validates :menu_id, presence: true

end
class OrderItem < ActiveRecord::Base

  belongs_to :item
  belongs_to :order

  validates :order_id, presence: true
  validates :item_id, presence: true

end
<% provide(:title, "#{header(@order)} #{@order.new_record? ? "order" : @order.id}") %>

<%= link_to "<< Back", :back, data: { confirm: back_message } %>

<h1><%= header(@order) %> <%= @order.new_record? ? "order" : @order.id %></h1>

<div class="row">
  <div class="col-md-6 col-md-offset-3">

    <%= nested_form_for @order do |f| %>

      <%= render 'shared/error_messages', object: f.object %>

      <div class="row">
        <div class="col-xs-6">
          <%= f.label :table_number %>
          <%= f.number_field :table_number, class: 'form-control' %>
        </div>
        <div class="col-xs-6">
          <%= f.label :number_of_customers %>
          <%= f.number_field :number_of_customers, class: 'form-control' %>
        </div>
      </div>

      <%= f.fields_for :order_items do |oi| %>
        <%= oi.grouped_collection_select :item_id, Menu.where(active: true).order(:name), :items, :name, :id, :name, { include_blank: 'Select Item' }, class: 'items_dropdown' %>
        <%= oi.hidden_field :item_id %>
        <%= oi.hidden_field :order_id %>
        <%= oi.link_to_remove "Remove item" %>
      <% end %>
      <p><%= f.link_to_add "Add an item", :order_items %></p>

      <br>

      <% if !@order.new_record? %>
        <%= f.label "Status" %>
        <%= f.select(:status, options_for_select([['Waiting', 'Waiting'], ['Ready', 'Ready'], ['Closed', 'Closed']], @order.status), class: 'form-control') %>
      <% end %>

      <%= f.label "Comments - how would you like your steak cooked? Or feedback" %>
      <%= f.text_area :comment, size: "20x5", class: 'form-control' %>

      <%= f.submit submit_label(@order), class: "btn btn-success col-md-6" %>
    <% end %>

    <% if !@order.new_record? && current_employee.try(:admin?) %>
      <%= link_to "Cancel", :back, data: { confirm: back_message }, class: "btn btn-warning col-md-offset-1 col-md-2" %>
      <%= link_to "Delete", @order, method: :delete, data: { confirm: "Are you sure? The employee will be deleted! "}, class: "btn btn-danger col-md-offset-1 col-md-2" %>
    <% else %>
      <%= link_to "Cancel", :back, data: { confirm: back_message }, class: "btn btn-warning col-md-offset-1 col-md-5" %>
    <% end %>

  </div>
</div>
   order = Order.new(order_params)
   item = Item.new(name: 'item-name', product_info: 'etc etc')

   if order.save
    item.create
    order.items << item
   end
def create
  @order = current_employee.orders.build(order_params)

  if @order.save
    item = params["order"]["order_items_attributes"]
    #please debug above one and try to get your items from params. 
    order_item = Item.create(item)
    #makes sure above item hold all item attributes then create them first
    @order.items << item 
    redirect_to @order
  end

end