Глубоко вложенные параметры в рельсах не меняют значения с формы на контроллер - PullRequest
0 голосов
/ 12 октября 2019

У меня странная ошибка с ruby ​​на рельсах. Я не знаю, является ли это ошибкой или чем-то еще, но прежде чем сообщить об этом, я просто хочу убедиться.

У меня есть полиморфная таблица, которая принадлежит_2 моделям.

полиморфная таблица

module Spree
  class AccountPrice < Spree::Base
    validates :accountable, presence: true

    belongs_to :accountable, polymorphic: true
    belongs_to :variant_price_set, class_name: "Spree::VariantPriceSet"
    belongs_to :shipping_method_price_set, class_name: "Spree::ShippingMethodPriceSet"

    accepts_nested_attributes_for :variant_price_set, :shipping_method_price_set

  end
end

мой CorporateAccount может содержать многие из этих полиморфных таблиц.

class Spree::CorporateAccount < Spree::Base
  has_many :account_prices, as: :accountable, autosave: true
  accepts_nested_attributes_for :account_prices
end

Итак, в моем корпоративном представлении редактирования яиметь это.

<%= f.fields_for :account_prices do |ff| %> 
      <div class="row">
         <%= ff.fields_for :variant_price_set do |fff|%>
           <div class="col-md-2" >
             <%= fff.text_field :id %>
           </div>
           <div class="col-md-2">
              <%= fff.text_field :name %>
           </div>
         <% end %>

         <%= ff.fields_for :shipping_method_price_set do |fff|%>
           <div class="col-md-2">
              <%= fff.text_field :id %>
           </div>
           <div class="col-md-2">
             <%= fff.text_field :name %>
           </div>
         <% end %>

         <div class="col-md-2">
          start_date: <%= ff.text_field :exp_start_date%>
        </div>
        <div class="col-md">
           end_date: <%= ff.text_field :exp_end_date%>
        </div>

        <div class="col-md">
          staus: <%= ff.text_field :status%>
       </div>
    </div>
<% end %>

и на моем корпоративном контроллере, у меня есть это.

module Spree
  module Admin
    class CorporateAccountsController < ResourceController
      def update

        if @corporate_account.update_attributes(corporate_account_params)
          flash.now[:success] = Spree.t(:corporate_account_updated)
        end

        render :edit
      end

      def corporate_account_params
        params.require(:corporate_account).permit(:company_id,
                                                  :company_name,
                                                  :shipping_category_id,
                                                  :variant_price_set_id,
                                                  :shipping_method_price_set_id,
                                                  :corporate_token,
                                                  :corporate_token_confirmation,
                                                  :account_key,
                                                  :managed,
                                                  :billing_type,
                                                  :tax_exempt,
                                                  ship_address_attributes: permitted_address_attributes,
                                                  bill_address_attributes: permitted_address_attributes,
                                                  account_prices_attributes: [
                                                    :id, :exp_start_date, :exp_end_date, :status,
                                                    shipping_method_price_set_attributes: [:id, :name], 
                                                    variant_price_set_attributes: [:id, :name]
                                                  ]
                                                 )
      end
    end
  end
end

все, что на этом сильном обновлении параметров. за исключением глубоко вложенных. shipping_method_price_set_attributes и variant_price_set_attributes.

Поэтому, когда я меняю Id на любом из наборов цен и перехватываю его на корпоративном контроллере, используя точку останова vscode, значение params не изменяется. например, когда я ввожу 3 и нажимаю точку останова, проверяю параметры на прежние данные. Любая идея? Я думаю, что это ошибка. потому что до этого у меня было variant_price_set, оно обновлялось нормально, но когда я добавил shipping_method_price_set, оно больше не обновляется. надеюсь, что моя проблема имеет смысл

Пример параметров

{
  "utf8": "✓",
  "authenticity_token": "IOZB+SbHtP+rrK2j1LqI039lOe8BB95vQXChUERb8dWNcM+YqUSaur3wMxWHmxDWFyIq8SkvQ9E7aJmv7TV5iw==",
  "corporate_account": {
    "company_id": "waaaaaaaaaa",
    "company_name": "QQQ",
    "corporate_token": "",
    "corporate_token_confirmation": "",
    "account_key": "",
    "tax_exempt": "0",
    "billing_type": "creditcard",
    "shipping_category_id": "",
    "account_prices_attributes": {
      "0": {
        "variant_price_set_attributes": {
          "id": "2",
          "name": "Another Test Price Set"
        },
        "shipping_method_price_set_attributes": {
          "id": "2",
          "name": "Test Shipping Method Price Set 2"
        },
        "exp_start_date": "2019-10-11 17:42:36 UTC",
        "exp_end_date": "2019-11-10 17:42:36 UTC",
        "status": "temporary",
        "id": "2"
      },
      "1": {
        "variant_price_set_attributes": {
          "id": "1",
          "name": "Test Price Set"
        },
        "shipping_method_price_set_attributes": {
          "id": "1",
          "name": "Test Shipping Method Price Set"
        },
        "exp_start_date": "2019-10-11 17:42:36 UTC",
        "exp_end_date": "2019-10-11 17:42:36 UTC",
        "status": "temporary",
        "id": "1"
      }
    }
  },
  "button": "",
  "id": "1"
}

ОБНОВЛЕНИЕ СЕТЬ TAB POST REQ

corporate_account[company_id]: waaaaaaaaaa
corporate_account[company_name]: QQQ
corporate_account[corporate_token]: 
corporate_account[corporate_token_confirmation]: 
corporate_account[account_key]: 
corporate_account[tax_exempt]: 0
corporate_account[billing_type]: creditcard
corporate_account[shipping_category_id]: 
corporate_account[account_prices_attributes][0][variant_price_set_attributes][id]: 3
corporate_account[account_prices_attributes][0][variant_price_set_attributes][id]: 2
corporate_account[account_prices_attributes][0][shipping_method_price_set_attributes][id]: 2
corporate_account[account_prices_attributes][0][shipping_method_price_set_attributes][id]: 2
corporate_account[account_prices_attributes][0][exp_start_date]: 
corporate_account[account_prices_attributes][0][exp_end_date]: 
corporate_account[account_prices_attributes][0][status]: default
corporate_account[account_prices_attributes][0][id]: 2
corporate_account[account_prices_attributes][1][variant_price_set_attributes][id]: 3
corporate_account[account_prices_attributes][1][variant_price_set_attributes][id]: 1
corporate_account[account_prices_attributes][1][shipping_method_price_set_attributes][id]: 2
corporate_account[account_prices_attributes][1][shipping_method_price_set_attributes][id]: 1
corporate_account[account_prices_attributes][1][exp_start_date]: 
corporate_account[account_prices_attributes][1][exp_end_date]: 
corporate_account[account_prices_attributes][1][status]: default
corporate_account[account_prices_attributes][1][id]: 1

ОБНОВЛЕНИЕ 2

, поэтому я сделал запрос, используя бессонницу с той же структурой параметров. но когда я пытаюсь изменить эти значения

"variant_price_set_attributes": {
          "id": "1"
        },
        "shipping_method_price_set_attributes": {
          "id": "1"
        },

, я получил ошибку маршрутизации. это странно

ОБНОВЛЕНИЕ 2.1 Итак, я обнаружил еще одну странную вещь. по какой-то причине от бессонницы при попытке отладить это. Когда я изменяю значение variant_price или shipping_method, я получаю эту ошибку стека

Started PUT "/spree/admin/corporate_accounts" for ::1 at 2019-10-14 12:06:55 -0700
User excluded error: #<ActionController::RoutingError: No route matches [PUT] "/spree/admin/corporate_accounts">

ActionController::RoutingError (No route matches [PUT] "/spree/admin/corporate_accounts"):
  actionpack (4.2.6) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
  web-console (2.3.0) lib/web_console/middleware.rb:28:in `block in call'
  web-console (2.3.0) lib/web_console/middleware.rb:18:in `catch'
  web-console (2.3.0) lib/web_console/middleware.rb:18:in `call'
  actionpack (4.2.6) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
  railties (4.2.6) lib/rails/rack/logger.rb:38:in `call_app'
  railties (4.2.6) lib/rails/rack/logger.rb:20:in `block in call'
  activesupport (4.2.6) lib/active_support/tagged_logging.rb:68:in `block in tagged'

Если вы проверите ошибку исключенного пользователя, она говорит, что ни один маршрут не соответствует его, потому что идентификационный номер corporate_accounts потеряна длякакая-то странная причина. маршрут должен быть /spree/admin/corporate_accounts/1 это круто и раздражает.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...