Запазване на персонализиран атрибут в модела на поръчката в Spree eCommerce

Добавих персонализирано поле в моята таблица 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 %>

Този формуляр успешно изпраща полето в заявката за публикация (пълен дъмп по-долу) до 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][email protected]
order[custom_attribute]=2414
order[state_lock_version]=32
utf8=✓
utf8=✓

Вмъкнах @order.inspect на следващата страница (плащане), за да мога да видя в този момент, че @order.custom_attribute все още е нула.

Някой има ли представа какво трябва да направя, за да получа стойността custom_attribute, изпратена в заявката за публикация, запазена в модела с другите изпратени атрибути?

-------------------редактиране-------------------

Атрибутите, разрешени за Spree по подразбиране, са дефинирани тук https://github.com/spree/spree/blob/3-0-stable/core/lib/spree/core/controller_helpers/strong_parameters.rb и се добавят от strong_paramaters помощника тук (дон нямам представител, за да публикувам трета връзка):

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.

-------------------окончателна редакция------------------- Ако някой намери това в бъдеще и се опитва за отстраняване на подобен проблем, моят код по-горе всъщност е правилен; Бях (глупаво) го поставил в блок if Rails.env.production?.


person targaf    schedule 23.09.2015    source източник
comment
Можете ли да добавите кода на контролера, където ще бъдат присвоени атрибутите?   -  person eirikir    schedule 23.09.2015
comment
@eirkir е малко сложно, тъй като е в кодовата база на spree, но ще продължа и ще редактирам това, което според мен (може да е грешно), което искате.   -  person targaf    schedule 23.09.2015
comment
Как добавихте своя custom_attribute? Можеш ли да обясниш? Изправен съм пред същия проблем   -  person    schedule 15.03.2018


Отговори (1)


Ще ви дам пример, може би можете да го преведете във вашия код.


НЕЗАДЪЛЖИТЕЛНО

Представете си, че имам персонализирано действие, наречено "custom" на моя users контролер, дефинирано по този начин в моите маршрути:

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, ако искате.

Изход (Ако приемем, че съм написал "444" в моето text_field):

444

Надявам се това да ви помогне.

person soltex    schedule 23.09.2015