Пользовательская проверка, сообщение об ошибке не может отображаться - PullRequest
0 голосов
/ 08 февраля 2019

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

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

Мне просто не удается это сделать ...

Обновить (добавить корзину)

заказ инициализирован втележка для покупок:

class ShoppingCart

  delegate :sub_total, to: :order

  def initialize(token:)
    @token = token
  end

  def order
    @order ||= Order.find_or_initialize_by(token: @token, status: 0) do |order|
      order.sub_total = 0
    end
  end
end

форма в orders / new.html.erb

<%= simple_form_for @order, url: clients_checkout_path do |f| %>
  <div class="<%= 'error_message' if @order.errors.full_messages.any? %> ">
   <% if  @order.errors.any? %>
     <% @order.errors.full_messages.each do |msg| %>
      <li><%= msg %></li>
     <% end %>
    <% end %>
 </div>
  <%= f.hidden_field :user_id %>
  <%= f.input :cgos_accepted, as: :boolean, checked_value: true, unchecked_value: false %>
  <%= f.submit, class: "btn btn-main btn-block" %>
<% end %>

вот контроллер:

class Clients::OrdersController < Clients::ApplicationController

    def index
        @orders = Order.all
        @orders = @orders.filter_by_status(params[:status]) if params[:status]
    end

    def show
        @order = Order.find(params[:id])
    end

    def new
        @order = current_cart.order
        @billing_address = BillingAddress.new
    end

    def create
        @order = current_cart.order
        @order.update_sub_total!
        @order.update_total!
        if @order.update_attributes!(order_params.merge(user_id: current_user.id))
        redirect_to new_clients_order_payment_path(@order)
        end
    end

    private

    def order_params
        params.require(:order).permit(:status,  :user_id, :token , :sub_total, :cgos_accepted)
    end
end

в модели моего заказа Iдобавил проверку:

class Order < ApplicationRecord
  validate :accept_cgos, on: :update
  #[...]
  private 

  def accept_cgos
    if self.cgos_accepted == false
      errors.add(:base, :must_accept_cgos)
    end
  end
end

мой файл yml:

en:
  activerecord:
    errors:
      models:
        order:
          attributes:
            base:
              must_accept_cgos: Please accept the general condition of sales

Я ожидал, что в div отобразится предупреждение, но оно открывает Better Error и говорит:

ActiveRecord::RecordInvalid at /clients/cart/checkout
Validation failed: Please accept the general condition of sales

Так что это вроде работает, но почему не отображается в моем сообщении об ошибке?

Ответы [ 2 ]

0 голосов
/ 08 февраля 2019

почему он не отображается в моем сообщении об ошибке?

Из-за вашего действия create вы выполняете redirect_to, redirect_to сбрасывает order экземпляр и все ваши ошибки из объекта исчезли, попробуйте вместо этого добавить render :new.

# for example
def create
  if @order.updated
    redirect_to path
  else
    render :new
  end
end
0 голосов
/ 08 февраля 2019

update_attributes!

Вы используете bang-версию update_attributes, update_attributes!.Так же, как save! и create!, оно вызывает исключение, если сохранение не удается.

Если вы удалите восклицательный знак в вызове этого метода, update_attributes вернет false, если не удалось сохранить.

Рендеринг ошибки

Другая часть, котораяОтсутствует - отображает шаблон new в случае ошибки проверки.Если update_attributes вернет true, произойдет перенаправление, но если он вернет false, рельсы попытаются отрендерить create.html.erb по умолчанию.Но шаблон new также может использоваться в этом случае, но для этого необходимо указать rails.

Изменения кода

Измененная реализация может выглядеть следующим образом.

 if @order.update_attributes(order_params.merge(user_id: current_user.id)) # no bang
    redirect_to new_clients_order_payment_path(@order)
 else
   @billing_address = BillingAddress.new                                   # because the #new template requires it.
   render :new
 end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...