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