2013-08-09 2 views
0

연관성에 대해 NoMethodError을 처리하는 좋은 방법은 무엇입니까?연관성에 대해 NoMethodError를 올바르게 처리하십시오.

예를 들어 http://mysite.com/orders/ID_THAT_DOESNT_EXISTS/payments과 같은 URL을 방문한 경우 nil#payments이 호출되었다는 예외가 발생합니다.

이상적으로, 사용자에게 해당 ID의 주문이 존재하지 않는다고 부드럽게 알려주는 것이 이상적입니다.

다른 모든 모델에서 일반화하는 것이 더 좋을 것입니다. 존재하지 않는 순서를 볼 때마다, 당신은 떨어져 일할 수있는 코드 예제를 제공하지만, 가장 기본적인 의미에서하지 않은

module Spree 
    module Admin 
    class OrdersController < Spree::Admin::BaseController 
     require 'spree/core/gateway_error' 
     before_filter :initialize_txn_partials 
     before_filter :initialize_order_events 
     before_filter :load_order, :only => [:show, :edit, :update, :fire, :resend, :history, :user] 

     respond_to :html 

     def index 
     params[:q] ||= {} 
     params[:q][:completed_at_not_null] ||= '1' if Spree::Config[:show_only_complete_orders_by_default] 
     @show_only_completed = params[:q][:completed_at_not_null].present? 
     params[:q][:s] ||= @show_only_completed ? 'completed_at desc' : 'created_at desc' 

     if !params[:q][:created_at_gt].blank? 
      params[:q][:created_at_gt] = Time.zone.parse(params[:q][:created_at_gt]).beginning_of_day rescue "" 
     end 

     if !params[:q][:created_at_lt].blank? 
      params[:q][:created_at_lt] = Time.zone.parse(params[:q][:created_at_lt]).end_of_day rescue "" 
     end 

     if @show_only_completed 
      params[:q][:completed_at_gt] = params[:q].delete(:created_at_gt) 
      params[:q][:completed_at_lt] = params[:q].delete(:created_at_lt) 
     end 

     @search = Order.ransack(params[:q]) 
     @orders = @search.result.includes([:user, :shipments, :payments]).page(params[:page]).per(Spree::Config[:orders_per_page]) 
     respond_with(@orders) 
     end 

     def show 
     respond_with(@order) 
     end 

     def new 
     @order = Order.create 
     respond_with(@order) 
     end 

     def edit 
     respond_with(@order) 
     end 

     def update 
     return_path = nil 
     if @order.update_attributes(params[:order]) && @order.line_items.present? 
      @order.update! 
      unless @order.complete? 
      # Jump to next step if order is not complete. 
      return_path = admin_order_customer_path(@order) 
      else 
      # Otherwise, go back to first page since all necessary information has been filled out. 
      return_path = admin_order_path(@order) 
      end 
     else 
      @order.errors.add(:line_items, t('errors.messages.blank')) if @order.line_items.empty? 
     end 

     respond_with(@order) do |format| 
      format.html do 
      if return_path 
       redirect_to return_path 
      else 
       render :action => :edit 
      end 
      end 
     end 
     end 


     def fire 
     # TODO - possible security check here but right now any admin can before any transition (and the state machine 
     # itself will make sure transitions are not applied in the wrong state) 
     event = params[:e] 
     if @order.send("#{event}") 
      flash.notice = t(:order_updated) 
     else 
      flash[:error] = t(:cannot_perform_operation) 
     end 
     rescue Spree::Core::GatewayError => ge 
     flash[:error] = "#{ge.message}" 
     ensure 
     respond_with(@order) { |format| format.html { redirect_to :back } } 
     end 

     def resend 
     OrderMailer.confirm_email(@order, true).deliver 
     flash.notice = t(:order_email_resent) 

     respond_with(@order) { |format| format.html { redirect_to :back } } 
     end 

     private 

     def load_order 
     @order ||= Order.find_by_number(params[:id], :include => :adjustments) if params[:id] 
     @order 
     end 

     # Allows extensions to add new forms of payment to provide their own display of transactions 
     def initialize_txn_partials 
     @txn_partials = [] 
     end 

     # Used for extensions which need to provide their own custom event links on the order details view. 
     def initialize_order_events 
     @order_events = %w{cancel resume} 
     end 

    end 
    end 
end 
+0

이것은 완전히 제공하지 않는 컨트롤러 동작의 모양에 따라 다릅니다. –

답변

0

:

다음은 OrdersController의 예 플래시 메시지를 설정하고 어딘지로 리디렉션하십시오.

+0

안녕하세요, DGM, 나쁘다. 그냥 내 대답에 예제 코드를 추가했습니다. –

관련 문제