将自定义属性保存到 Spree 电子商务中的订单模型
Saving custom attribute to Order model in Spree eCommerce
我在我的 spree_orders table 中添加了一个自定义字段(我们称之为 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 %>
此表单成功将 post 请求中的字段(下面的完整转储)提交给 http://localhost:3000/checkout/update/address 作为 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=✓
我已经在下面的(支付)页面插入了@order.inspect,可以看到此时@order.custom_attribute仍然是零。
有谁知道我需要做什么才能将 post 请求中发送的 custom_attribute
值与其他属性一起保存到模型中?
--------------------编辑--------------------
默认的狂欢允许属性在此处定义 https://github.com/spree/spree/blob/3-0-stable/core/lib/spree/core/controller_helpers/strong_parameters.rb 并由 strong_paramaters
助手在此处添加(没有代表 post 第三个 link ):
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
可以在狂欢 github 仓库中找到 spree/core/lib/spree/core/controller_helpers/strong_parameters.rb
。
--------------------最终编辑--------------------
如果以后有人发现这个问题并试图解决类似的问题,我上面的代码实际上是正确的;我(愚蠢地)把它放在 if Rails.env.production?
块中。
我给你举个例子,也许你可以把它翻译成你的代码。
可选
假设我有一个自定义操作,在我的 users
控制器上称为 "custom"
,在我的路线中以这种方式定义:
resources :users do
collection do
get 'custom'
post 'custom'
end
end
这样我就可以用custom_users_path.
调用它
接下来,我想要一个提交给该函数的表单,为此您需要在 form_for 中指定一个 附加参数,名为 :url, 在此示例中,我使用 custom_users_path
调用它,一旦我提交表单,它将 运行 我的自定义操作。
form_for 看起来像这样:
<%= form_for :user, :url => custom_users_path do |f| %>
<%= f.text_field :random %>
<%= f.submit "Submit" %>
<% end %>
然后,我希望能够在我的用户控制器中访问一些 :random parameter
。假设我有一个 text_field,我想将值存储在我的 :random parameter
上(见上文)。首先,您需要允许在您的控制器中访问该参数,在本例中,在用户控制器中。这样:
params.require(:user).permit(YOUR PARAMETER HERE, {:random => []})
所以,每次我提交表单时,我都可以访问 :submit parameter
值,通过这样做 params["controller-name"]["parameter-name"]
,翻译成这个例子,看起来像:
params["user"]["random"]
如果需要,您可以使用 to_s 将其转换为字符串。
输出(假设我在 text_field 上写了“444”):
444
希望对您有所帮助。
我在我的 spree_orders table 中添加了一个自定义字段(我们称之为 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 %>
此表单成功将 post 请求中的字段(下面的完整转储)提交给 http://localhost:3000/checkout/update/address 作为 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=✓
我已经在下面的(支付)页面插入了@order.inspect,可以看到此时@order.custom_attribute仍然是零。
有谁知道我需要做什么才能将 post 请求中发送的 custom_attribute
值与其他属性一起保存到模型中?
--------------------编辑--------------------
默认的狂欢允许属性在此处定义 https://github.com/spree/spree/blob/3-0-stable/core/lib/spree/core/controller_helpers/strong_parameters.rb 并由 strong_paramaters
助手在此处添加(没有代表 post 第三个 link ):
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
可以在狂欢 github 仓库中找到 spree/core/lib/spree/core/controller_helpers/strong_parameters.rb
。
--------------------最终编辑--------------------
如果以后有人发现这个问题并试图解决类似的问题,我上面的代码实际上是正确的;我(愚蠢地)把它放在 if Rails.env.production?
块中。
我给你举个例子,也许你可以把它翻译成你的代码。
可选
假设我有一个自定义操作,在我的 users
控制器上称为 "custom"
,在我的路线中以这种方式定义:
resources :users do
collection do
get 'custom'
post 'custom'
end
end
这样我就可以用custom_users_path.
调用它接下来,我想要一个提交给该函数的表单,为此您需要在 form_for 中指定一个 附加参数,名为 :url, 在此示例中,我使用 custom_users_path
调用它,一旦我提交表单,它将 运行 我的自定义操作。
form_for 看起来像这样:
<%= form_for :user, :url => custom_users_path do |f| %>
<%= f.text_field :random %>
<%= f.submit "Submit" %>
<% end %>
然后,我希望能够在我的用户控制器中访问一些
:random parameter
。假设我有一个 text_field,我想将值存储在我的 :random parameter
上(见上文)。首先,您需要允许在您的控制器中访问该参数,在本例中,在用户控制器中。这样:
params.require(:user).permit(YOUR PARAMETER HERE, {:random => []})
所以,每次我提交表单时,我都可以访问 :submit parameter
值,通过这样做 params["controller-name"]["parameter-name"]
,翻译成这个例子,看起来像:
params["user"]["random"]
如果需要,您可以使用 to_s 将其转换为字符串。
输出(假设我在 text_field 上写了“444”):
444
希望对您有所帮助。