Rails формируют рендеринг несколько раз при использовании `.build` - PullRequest
0 голосов
/ 16 октября 2019

Итак, у меня есть пользовательская форма form_for, которая принимает вложенные атрибуты из account_prices. То, что происходит на моем контроллере пользователя, у меня есть этот закрытый метод.

def pre_build_user_account_prices
        if @user.account_prices.empty?
          @accountable_default = @user.account_prices.build(status: 'default')
          @accountable_temporary = @user.account_prices.build(status: 'temporary')
        else
          @accountable_default = @user.account_prices.where(status: 'default')
          @accountable_temporary = @user.account_prices.where(status: 'temporary')
        end
      end

причина условия заключается в том, что если я не выполню проверку здесь, то будет выполнено 2 формы. пустая форма и с формой данных. Поэтому проверка здесь необходима


, но моя проблема заключается в следующем. Я нахожусь на пути редактирования, и когда я пытаюсь отправить неверную форму, она отображает несколько пустых форм. вот изображение.

enter image description here

Если я продолжу отправлять неверную форму, она будет отображаться несколько раз. Я думал, если проверю через JS, если есть многократный ребенок, я удалю это. это лучший подход?

вот мои ассоциации

Class User
  has_many :account_prices, as: :accountable, autosave: true
  accepts_nested_attributes_for :account_prices
end

полиморфный

 class AccountPrice
      enum status: {default: 'default', temporary: 'temporary'}

      validates :accountable, presence: true
      validates :status, presence: true
      validates :exp_start_date, presence: true, if: :is_temporary_status?
      validates :exp_end_date, presence: true, if: :is_temporary_status?

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

      def is_temporary_status?
        status == 'temporary'
      end

    end

пользовательский контроллер

Class UsersController
  before_action :pre_build_user_account_prices, only: :edit

  def update

        if @user.update_attributes(user_params)
          flash.now[:success] = Spree.t(:account_updated)
          redirect_to show_admin_user_path(@user)
        else
         render :edit
        end
   end

  def pre_build_user_account_prices
        if @user.account_prices.empty?
          @accountable_default = @user.account_prices.build(status: 'default')
          @accountable_temporary = @user.account_prices.build(status: 'temporary')
        else
          @accountable_default = @user.account_prices.where(status: 'default')
          @accountable_temporary = @user.account_prices.where(status: 'temporary')
        end
      end
end

1 Ответ

0 голосов
/ 16 октября 2019

Я думаю, когда вы пытаетесь @user.account_prices.where(..., это чтение данных, которые не сохраняются в БД. Я имею в виду account_prices, который был только что собран на предыдущем шаге.

Try,

def pre_build_user_account_prices
    if @user.account_prices.empty?
      @accountable_default = @user.account_prices.build(status: 'default')
      @accountable_temporary = @user.account_prices.build(status: 'temporary')
    else
      @accountable_default = @user.reload.account_prices.where(status: 'default')
      @accountable_temporary = @user.reload.account_prices.where(status: 'temporary')
    end
end

reload , перезагружает атрибуты объекта из базы данных

Кроме того, при использовании accept_nested_attributes для обновления существующей записи необходимо убедиться, что идентификатор вложенного объекта, для которого вы принимаете вложенный атрибут, является частью переданных атрибутов.

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