Ruby on rails 4 扩展Spree::LineItem以包括票证对象

Ruby on rails 4 扩展Spree::LineItem以包括票证对象,ruby-on-rails-4,spree,Ruby On Rails 4,Spree,My Ticket对象引用Spree::LineItem,它接受:Ticket的嵌套属性。我已将@ticket\u属性添加到强参数和@line\u item\u属性中。我已经在模型中包含了has_one/归属关系。为每一行项目创建一个功能性嵌套表单,以创建票据 票.rb class Ticket < ActiveRecord::Base belongs_to :line_item end 允许的属性.rb module Spree module PermittedAttribu

My Ticket对象引用Spree::LineItem,它接受:Ticket的嵌套属性。我已将@ticket\u属性添加到强参数和@line\u item\u属性中。我已经在模型中包含了has_one/归属关系。为每一行项目创建一个功能性嵌套表单,以创建票据

票.rb

class Ticket < ActiveRecord::Base
   belongs_to :line_item
end
允许的属性.rb

module Spree
  module PermittedAttributes
    ATTRIBUTES = [
      ...
      :taxonomy_attributes,
      :ticket_attributes,
      :user_attributes,
      :variant_attributes
    ]

    mattr_reader *ATTRIBUTES

    ...

    @@line_item_attributes = [:id, :variant_id, :quantity, :ticket_attributes]

    ...


    @@ticket_attributes = [:id, :line_item_id, :first_name, :last_name, :start_date, 
    :end_date, :time]

    ...
  end
end
当我单击“checkout”时,我可以看到参数正在传递并正确嵌套,但控制台会给我一条消息“unpermittedparameters:ticket”

Started PATCH "/cart" for 127.0.0.1 at 2014-02-24 09:44:44 -0500
Processing by Spree::OrdersController#update as HTML
  Parameters: {"utf8"=>"✓", "authenticity_token"=>"YwCp2xUMd1Zc/v4eWfmMbFMiJdUQo+YYp/86nvSw5nc=", "order"=>{"line_items_attributes"=>{"0"=>{"quantity"=>"2", "ticket"=>{"first_name"=>"Nasty", "last_name"=>"Coffee", "start_date(1i)"=>"2014", "start_date(2i)"=>"2", "start_date(3i)"=>"24"}, "id"=>"23"}}, "coupon_code"=>""}, "checkout"=>""}
  Spree::Preference Load (0.4ms)  SELECT "spree_preferences".* FROM "spree_preferences" WHERE "spree_preferences"."key" = 'spree/frontend_configuration/locale' LIMIT 1
  Spree::Order Load (0.4ms)  SELECT "spree_orders".* FROM "spree_orders" WHERE "spree_orders"."number" IS NULL LIMIT 1
  Spree::Order Load (0.3ms)  SELECT "spree_orders".* FROM "spree_orders" WHERE "spree_orders"."id" = 6 AND "spree_orders"."currency" = 'USD' LIMIT 1
  Spree::Adjustment Load (0.3ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."adjustable_type" = 'Spree::Order' AND "spree_adjustments"."adjustable_id" IN (6) ORDER BY spree_adjustments.created_at ASC
  Spree::TokenizedPermission Load (0.3ms)  SELECT "spree_tokenized_permissions".* FROM "spree_tokenized_permissions" WHERE "spree_tokenized_permissions"."permissable_id" = $1 AND "spree_tokenized_permissions"."permissable_type" = $2 ORDER BY "spree_tokenized_permissions"."id" ASC LIMIT 1  [["permissable_id", 6], ["permissable_type", "Spree::Order"]]
Unpermitted parameters: ticket
   (0.1ms)  BEGIN
  Spree::LineItem Load (0.4ms)  SELECT "spree_line_items".* FROM "spree_line_items" WHERE "spree_line_items"."order_id" = $1 AND "spree_line_items"."id" IN (23) ORDER BY created_at ASC  [["order_id", 6]]
  Spree::Payment Load (0.2ms)  SELECT "spree_payments".* FROM "spree_payments" WHERE "spree_payments"."order_id" = $1 AND "spree_payments"."state" = 'completed'  [["order_id", 6]]
  Spree::LineItem Load (0.2ms)  SELECT "spree_line_items".* FROM "spree_line_items" WHERE "spree_line_items"."order_id" = $1 ORDER BY created_at ASC  [["order_id", 6]]
  Spree::Adjustment Load (0.3ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."adjustable_id" = $1 AND "spree_adjustments"."adjustable_type" = $2 AND "spree_adjustments"."eligible" = 't' ORDER BY spree_adjustments.created_at ASC  [["adjustable_id", 6], ["adjustable_type", "Spree::Order"]]
  Spree::Adjustment Load (0.5ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."order_id" = $1 AND "spree_adjustments"."originator_type" = 'Spree::TaxRate'  [["order_id", 6]]
  Spree::Payment Load (0.4ms)  SELECT "spree_payments".* FROM "spree_payments" WHERE "spree_payments"."order_id" = $1 AND ("spree_payments"."state" NOT IN ('failed', 'invalid'))  [["order_id", 6]]
  CACHE (0.0ms)  SELECT "spree_payments".* FROM "spree_payments" WHERE "spree_payments"."order_id" = $1 AND "spree_payments"."state" = 'completed'  [["order_id", 6]]
  CACHE (0.0ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."adjustable_id" = $1 AND "spree_adjustments"."adjustable_type" = $2 AND "spree_adjustments"."eligible" = 't' ORDER BY spree_adjustments.created_at ASC  [["adjustable_id", 6], ["adjustable_type", "Spree::Order"]]
  CACHE (0.0ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."order_id" = $1 AND "spree_adjustments"."originator_type" = 'Spree::TaxRate'  [["order_id", 6]]
  CACHE (0.0ms)  SELECT "spree_payments".* FROM "spree_payments" WHERE "spree_payments"."order_id" = $1 AND ("spree_payments"."state" NOT IN ('failed', 'invalid'))  [["order_id", 6]]
   (0.1ms)  COMMIT
something
   (0.1ms)  BEGIN
   (0.1ms)  COMMIT
something 1
  Spree::Shipment Exists (0.2ms)  SELECT 1 AS one FROM "spree_shipments" WHERE "spree_shipments"."order_id" = $1 LIMIT 1  [["order_id", 6]]
  Spree::Activator Load (0.3ms)  SELECT "spree_activators".* FROM "spree_activators" WHERE (starts_at IS NULL OR starts_at < '2014-02-24 14:44:44.387522') AND (expires_at IS NULL OR expires_at > '2014-02-24 14:44:44.387735') AND (event_name LIKE 'spree.order.contents_changed%')
  CACHE (0.0ms)  SELECT "spree_payments".* FROM "spree_payments" WHERE "spree_payments"."order_id" = $1 AND "spree_payments"."state" = 'completed'  [["order_id", 6]]
  CACHE (0.0ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."adjustable_id" = $1 AND "spree_adjustments"."adjustable_type" = $2 AND "spree_adjustments"."eligible" = 't' ORDER BY spree_adjustments.created_at ASC  [["adjustable_id", 6], ["adjustable_type", "Spree::Order"]]
  CACHE (0.0ms)  SELECT "spree_adjustments".* FROM "spree_adjustments" WHERE "spree_adjustments"."order_id" = $1 AND "spree_adjustments"."originator_type" = 'Spree::TaxRate'  [["order_id", 6]]
  CACHE (0.0ms)  SELECT "spree_payments".* FROM "spree_payments" WHERE "spree_payments"."order_id" = $1 AND ("spree_payments"."state" NOT IN ('failed', 'invalid'))  [["order_id", 6]]
Redirected to http://localhost:3000/checkout/address
Completed 302 Found in 31ms (ActiveRecord: 4.9ms)
如何包含票证属性

编辑

我决定把票忘了,只延长行项目。但还是有同样的问题。我已尝试将:开始日期属性添加到
order\u参数
,如下所示(b/c开始日期是一个
date\u选择

def order_params
      if params[:order]
        params[:order].permit(*permitted_order_attributes, :"start_date(1i)")
      else
        {}
      end
    end
这是:

def order_params
      if params[:order]
        params[:order].permit(*permitted_order_attributes, :start_date)
      else
        {}
      end
    end

Spree::OrdersController#update
中,您试图
更新
属性
票据
,这是不允许的。
因此,在OrdersController中允许
票证
作为强参数(order\u params方法)对于您的<代码>命令> />代码> ./p> ,可以直接将属性添加到核心/LIB/SPRE/Cyr/控件/Helps/StrugIsPosits中的强参数。参数:您的_属性

@科蒂·索拉特:谢谢你的回答。我之所以不接受你的回答,仅仅是因为我已经按照问题的解决方法去做了,而改变方法并没有达到预期的效果

这是我必须做的

def permitted_order_attributes
  permitted_checkout_attributes + [
    :line_items_attributes => permitted_line_item_attributes, 
    :start_date => :start_date
  ]
end

我不确定您是否收到了编辑通知。因此,我在这里评论b/c我相信您会收到通知。再次感谢。@user2168130更新订单
@order.update\u属性(订单参数)
在您的
update
操作中被调用,其中在
order\u params
方法中,将指定
order
模型允许并允许更新的所有属性。您需要在
order\u params
方法中指定
ticket
属性,否则它将不会被更新。是的,我知道是什么你在说,但我不明白“如何”。此外,我改变了我的方法b/c,我无法理解。我决定扩展行项目本身。但是,我仍然需要将属性添加到order参数。我只是不知道如何。这是因为在
@order.update\u attributes(order\params)中调用的方法
。请注意,
order\u params
作为参数传递给update\u attributes调用。方法名称
order\u params
无关紧要,您可以使用相同的许可代码调用名为
xyz
的方法,并将其称为
@order.update\u attributes(xyz)
它仍然可以工作。好的。那么,我该怎么做呢?你修改了核心库吗?或者你扩展了核心库还是破坏了核心库?文件放在哪里?看看这个,我相信我是根据我回答的措辞将其添加到Spree的核心库文件中的。
def permitted_order_attributes
          permitted_checkout_attributes + [
            :line_items_attributes => permitted_line_item_attributes 
          ]
        end
def order_params
      if params[:order]
        params[:order].permit(*permitted_order_attributes, :"start_date(1i)")
      else
        {}
      end
    end
def order_params
      if params[:order]
        params[:order].permit(*permitted_order_attributes, :start_date)
      else
        {}
      end
    end
def permitted_order_attributes
  permitted_checkout_attributes + [
    :line_items_attributes => permitted_line_item_attributes, 
    :start_date => :start_date
  ]
end