Сохранение пользовательского атрибута в модели заказа в электронной коммерции 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 %>

Эта форма успешно отправляет поле почтового запроса (полный дамп ниже) на 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 (don у меня нет представителя, чтобы опубликовать третью ссылку):

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.

-------------------финальное редактирование----- Если кто-то найдет это в будущем и попытается чтобы устранить аналогичную проблему, мой код выше действительно правильный; Я (по глупости) поместил его в блок if Rails.env.production?.


person targaf    schedule 23.09.2015    source источник
comment
Можете ли вы добавить код контроллера, в котором будут назначаться атрибуты?   -  person eirikir    schedule 23.09.2015
comment
@eirkir это немного сложно, так как это в кодовой базе веселья, но я продолжу и отредактирую то, что, как я думаю (может быть неправильно), вы просите.   -  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" в своем текстовом поле):

444

Я надеюсь, это поможет вам.

person soltex    schedule 23.09.2015