Проверьте заявления - PullRequest
       3

Проверьте заявления

1 голос
/ 02 марта 2012

Привет, у меня есть следующий код:

def update_for_transport_document
    # => DESCRIPTION:
    # => Utilizzata nelle form di associazione di un warehouse ad una bolla
    @wh_errors = Hash.new

    if request.path.include? "ingress_transport_document"
        session[:user_role] != "administrator" ?
            @itd = IngressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) :
            @itd = IngressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
            @all_itd = IngressTransportDocument.all
            logger.debug { "INGRESS_TRANSPORT_DOCUMENT_ID: #{@itd.id} " }
           @warehouse = Warehouse.find(params[:warehouse][:id])

           #check_warehouse_in_td(@all_itd,@warehouse)
          @all_itd.each do |td|
            td.warehouses.each do |whs|
                logger.debug {"TD WAREHOUSES:#{whs.id} && #{@warehouse.id}"}
                    if whs.id == @warehouse.id
                     @ok = 'ciccia'
                     break
                   break
              end               
       end
       end
       logger.debug {"OK:#{@ok} "}
        if @ok != 'ciccia'  
  @itd.warehouses << @warehouse

           else
            logger.debug{"NOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO"}
           end  
              respond_to do |format|   
         format.html { redirect_to(@itd) }
            format.xml  { head :ok }
            end



    else 

        session[:user_role] != "administrator" ?
            @etd = EgressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) :
            @etd = EgressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
            logger.debug { "TEST" }
            logger.debug { "EGRESS_TRANSPORT_DOCUMENT_ID: #{@etd.id}" }
               @warehouse = Warehouse.find(params[:warehouse][:id])
           logger.debug { "WAREHOUSE_ID: #{@warehouse.id}" }
    @etd.warehouses << @warehouse
             respond_to do |format|
               format.html { redirect_to(@etd) }
               format.xml  { head :ok } 
          end
      end

конец

и я бы хотел, чтобы @warehouse можно было добавить к @itd(@etd).warehouses, только если тот же склад отсутствует в других ingress(egress)transport документах.

Моя проблема заключается в том, что с помощью этого кода любой склад может быть добавлен к @itd(@etd).warehouses как в том случае, если склад присутствует в другом транспортном документе, так и в том случае, если он новый, не связанный ни с одним itd/etd.

Где ошибка?

1 Ответ

1 голос
/ 03 марта 2012

Трудно найти ошибку в вашем коде.

Я не буду пытаться угадать, какая из строк допускает ошибки, вместо этого я дам вам несколько советов:

В среде Rails есть общее правило fat models - skinny controllers.Для вашего кода это означает: оставьте только минимум над кодом, сгенерированным скаффолдингом.Вся бизнес-логика переходит в модели.Вы можете спросить, почему: есть несколько причин: вы можете повторно использовать свой код, гораздо проще провести модульное тестирование по модели, чем по контроллеру.

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

Одна вещь в вашем коде: чрезмерное использование ? оператора

session[:user_role] != "administrator" ?
        @itd = IngressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) :
        @itd = IngressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])

Менее читаемо, чем:

if session[:user_role] != "administrator" then
    @itd = IngressTransportDocument.filtered_by_registry(session[:registry_id]).find(params[:warehouse][:ingress_transport_document_id]) 
else
    @itd = IngressTransportDocument.find(params[:warehouse][:ingress_transport_document_id])
end if
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...