ruby-on-rails - 将自定义属性保存到 Spree 电子商务中的订单模型

标签 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 %>

此表单成功将 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 仍然为零。

有谁知道我需要做什么才能获得 custom_attribute post 请求中发送的值与发送的其他属性一起保存到模型?

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

此处定义了默认的 spree 允许属性 https://github.com/spree/spree/blob/3-0-stable/core/lib/spree/core/controller_helpers/strong_parameters.rb并由 strong_paramaters 添加 helper 在这里(没有代表发布第三个链接):

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 找到在疯狂的 github repo 中。

----------------最终编辑-------------------- 如果以后有人发现这个问题并试图解决类似的问题,我上面的代码实际上是正确的;我(愚蠢地)把它放在了 if Rails.env.production? 中。 block 。

最佳答案

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


可选

假设我在我的 users Controller 上有一个名为 "custom" 的自定义操作,在我的路由中以这种方式定义:

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

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

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

form_for 看起来像这样:

<%= form_for :user, :url  => custom_users_path do |f| %>
  <%= f.text_field :random %>
  <%= f.submit "Submit" %>
<% end %>


然后,我希望能够在我的用户 Controller 中访问一些 :random parameter。假设我有一个 text_field,我想将值存储在我的 :random parameter 上(见上文)。首先,您需要允许在您的 Controller 中访问该参数,在本例中,在用户 Controller 中。这样:

params.require(:user).permit(YOUR PARAMETER HERE, {:random => []})

因此,每次我提交表单时,我都可以访问 :submit parameter 值,方法是 params["controller-name"]["parameter-name"],翻译成这个例子,看起来像:

params["user"]["random"]

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

输出(假设我在 text_field 上写了“444”):

444

希望对你有帮助

关于ruby-on-rails - 将自定义属性保存到 Spree 电子商务中的订单模型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32745536/

相关文章:

ruby - 使用 Ruby 的 Net::FTP 类上传文件是同步操作吗?

ruby-on-rails - Ruby elasticsearch-model-配置多个映射

mysql - Ruby On Rails 关于多对多关系的数据从 sqlite3 迁移到 mysql

ruby-on-rails - ActiveModel::UnknownAttributeError: PaperTrail::VersionAssociation 的未知属性 'foreign_type'

ruby-on-rails - 仅生产环境? - 未初始化常量 ActiveRecord::AssociationNotFoundError (NameError) - 异常

ruby-on-rails - spree 分页产品数量变化

ruby-on-rails - 如何:Spree::Product 与您的其他模型之间的关系

ruby-on-rails - Rails 应用程序无法连接到 postgresql,但 rake、rails c 和 rails db 可以

ruby-on-rails - 更新 rails 到 2.3.6

ruby - 如何为包含 "gets.chomp"的 Ruby 方法编写 RSpec 测试?