在Spree电子商务中将自定义属性保存到订单模型

时间:2015-09-23 17:10:25

标签: ruby-on-rails ruby spree

我在spree_orders表中添加了一个自定义字段(我们称之为custom_attribute)。

我已将Spree::PermittedAttributes.checkout_attributes << [:custom_attribute]添加到我的spree.rb初始值设定项中。

在我的结帐流程中,我有一个自定义表单,其中包含以下代码(已删除html格式):

<%= form_for @order do |alt_form| %>
      <%= alt_form.label :custom_attribute, "Custom Attribute" %><span class="required">*</span><br />
      <%= alt_form.text_field :custom_attribute, :class => 'form-control required', maxlength: 11 %>
<% end %>

此表单成功将帖子请求中的字段(下面的完整转储)提交为order[custom_attribute] xyz _method=patch _method=patch authenticity_token=Y+ATRotWKfI57f+b0/YGwIw9Bg6mADHBDmeEOHYzLPnB6Vbydya4ITDTopcX65EG+TiL7bwyJKQPpBU9bQTaUg== authenticity_token=Y+ATRotWKfI57f+b0/YGwIw9Bg6mADHBDmeEOHYzLPnB6Vbydya4ITDTopcX65EG+TiL7bwyJKQPpBU9bQTaUg== commit=Save and Continue order[bill_address_attributes][address1]=123 Test order[bill_address_attributes][address2]= order[bill_address_attributes][city]=Test order[bill_address_attributes][country_id]=232 order[bill_address_attributes][firstname]=Test order[bill_address_attributes][id]=3 order[bill_address_attributes][lastname]=Test order[bill_address_attributes][phone]=555555555 order[bill_address_attributes][state_id]=3535 order[bill_address_attributes][zipcode]=30024 order[email]=spree@example.com order[custom_attribute]=2414 order[state_lock_version]=32 utf8=✓ utf8=✓ ,但信息不会保存到模型中。

custom_attribute

我已在以下(付款)页面上插入@ order.inspect,以便可以看到@ order.custom_attribute仍为零。

有没有人知道我需要做什么才能将发布请求中发送的strong_paramaters值保存到模型并发送其他属性?

-------------------编辑-------------------

此处http://localhost:3000/checkout/update/address定义了默认的狂欢允许属性,并由module Spree module Core module ControllerHelpers module StrongParameters def permitted_attributes Spree::PermittedAttributes end delegate *Spree::PermittedAttributes::ATTRIBUTES, to: :permitted_attributes, prefix: :permitted def permitted_payment_attributes permitted_attributes.payment_attributes + [ source_attributes: permitted_source_attributes ] end def permitted_checkout_attributes permitted_attributes.checkout_attributes + [ bill_address_attributes: permitted_address_attributes, ship_address_attributes: permitted_address_attributes, payments_attributes: permitted_payment_attributes, shipments_attributes: permitted_shipment_attributes ] end def permitted_order_attributes permitted_checkout_attributes + [ line_items_attributes: permitted_line_item_attributes ] end def permitted_product_attributes permitted_attributes.product_attributes + [ product_properties_attributes: permitted_product_properties_attributes ] end end end end end 助手在此处添加(没有代表发布第三个链接):

spree/core/lib/spree/core/controller_helpers/strong_parameters.rb

可以在spree github repo中找到if Rails.env.production?

-------------------最终编辑------------------- 如果有人在将来发现这一点,并且正在尝试解决类似的问题,我上面的代码实际上是正确的;我(愚蠢地)将它放在{{1}}块中。

1 个答案:

答案 0 :(得分:1)

我会举个例子,也许你可以把它翻译成你的代码。


可选

想象一下,我的"custom"控制器上有一个名为users的自定义操作,在我的路径中以这种方式定义:

resources :users do
  collection do
    get 'custom'
    post 'custom'
  end
end

这样我就可以使用 custom_users_path 来调用它。

接下来,我想要一个提交给该函数的表单,为此,您需要在form_for中指定一个名为:url 的附加参数,在本例中我使用{{1}调用它},一旦我提交表单,它将运行我的自定义操作。

form_for会如下所示:

custom_users_path

<小时/> 然后,我希望能够访问用户控制器中的某些<%= form_for :user, :url => custom_users_path do |f| %> <%= f.text_field :random %> <%= f.submit "Submit" %> <% end %> 。让我们假设我有一个text_field,我希望将值存储在:random parameter上(见上文)。首先,您需要允许在控制器中访问该参数,在本例中,在用户控制器中。这样:

:random parameter

因此,每次我提交表单时,我都可以访问params.require(:user).permit(YOUR PARAMETER HERE, {:random => []}) 值,通过这样做:submit parameter,翻译成这个示例,看起来像:

params["controller-name"]["parameter-name"]

如果需要,可以使用to_s将其转换为字符串。

输出(假设我在我的text_field上写了&#34; 444&#34;)

params["user"]["random"]

我希望这会对你有所帮助。