4

Phusion Passenger을 사용하여 배포 된 레일 사이트에서 유지 보수 작업을하고 있습니다. 워크 플로우는 표준 3 단계 Railsian 테스트 - 개발 - 생산 배열과 조금 다릅니다. 대신, 병렬 Oracle 데이터베이스에 대해 실행되는 동일한 코드베이스의 두 가지 개별 설치가 있습니다. 개발 사이트는 qa.domain.com에 있으며, 라이브 사이트는 www.domain.com에 있습니다.레일 : dev 및 생산에 대한 다른 동작

다음 코드 조각 (AuthenticatedSystem을 사용하는 vendors_controller.rb)에서 다른 동작이 발생합니다.

주석 사이의 코드는 시스템이 해당 등록을 작성할 수없는 경우 방금 작성된 사용자 오브젝트를 삭제합니다. 개발 서버에서는 정상적으로 작동하지만 프로덕션 서버에서는 작동하지 않습니다. 프로덕션 서버에서는 등록을 저장하지 않아도 User 오브젝트가 데이터베이스 주위를 고집합니다. 컨트롤러 파일을 업로드하고 쉘을 통해 touch tmp/restart.txt을 수행하는 것만 큼 변경 사항을 프로덕션으로 보내면됩니다. 두 코드베이스는 다른 경우 동일합니다. 이 차이를 일으키는 원인은 무엇일까요?

감사합니다.

저스틴

편집 : 문제를 진단 할 수있는 두 개의 설치를 통해 production.rb에서 약간의 차이가 있습니다. 생산시에,

config.cache_classes = true 

# Full error reports are disabled and caching is turned on 
config.action_controller.consider_all_requests_local = false 
config.action_controller.perform_caching    = true 

개발 중에는, 3 개의 플래그가 그 역의 값으로 설정됩니다. 감사! 말로 미루어 보아, 당신이 사용하지 않는 거래 당신은 컨트롤러

에 너무 많은 일을하고

    1. :

  • 답변

    1

    당신은 당신의 코드에 대한 변경 고려해야 할 몇 가지가있다 문제가 발생한 이유는 아마도 생산과 개발 간의 환경 차이 때문일 가능성이 높습니다.

    그러나 나는 당신의 모든 행동을 느리게 할 것이기 때문에 이것을 프로덕션에서 변경해야한다고 생각하지 않습니다. 대신 프로덕션 환경과 거의 일치하는 준비 환경을 사용하는 것이 좋습니다.

    # using before filters will keep your actions tight 
    before_filter :cannot_create_user, :if => :signed_in? 
    
    def create 
        # setup all the objects 
        @user = User.new(params[:user]) 
    
        @user.user_type = 'vendor' 
        @user.active = 1 
    
        @user.has_role 'owner', @user 
        @user.has_role 'vendor' 
    
        @registration = @user.registrations.build(params[:registration]) 
        @registration.active = 1 
        @registration.email = @user.email 
    
        # make sure everything is valid before trying to save and activate 
        if @user.valid? 
        @user.save! # might not need this if activate calls save! 
        @user.activate! 
    
        # this should probably be a sign_in() method... 
        self.current_user = @user 
    
        send_confirmation(@user) 
        send_solicitations_notifications(@registration) if @registration.notification_desired? 
    
        redirect_to thank_you_vendors_path 
        else 
        respond_to do |format| 
         format.html { render :action => 'new' } 
         format.xml { render :xml => @registration.errors, :status => :unprocessable_entity } 
        end 
        end 
    
    ... 
    end 
    
    
    protected 
    
    def signed_in? 
        !current_user.nil? 
    end 
    
    def cannot_create_user 
        respond_to do |format| 
        format.html { render :action => 'new' } 
        format.xml { render :xml => @user.errors, :status => :unprocessable_entity } 
        end 
    end 
    

    N.B. :

    문제를 해결하려면, 내가 가장 가능성이 같은 작업을 다시 것 나는 이것을 테스트하지 않았지만 작동하지 않을 수도 있지만 아이디어를 얻어야한다 ... 만약 당신이 단위 테스트를한다면 (나는 당신이 희망한다 ...) 그것을 떨어 뜨리고 그것이 작동 하는지를 볼 수 있어야한다!

    다음 단계는 등록 객체에 accepts_nested_attribute_for을 사용하여 사용자 매개 변수의 일부로 제출할 수 있습니다.

    나는 또한 모든 역할 설정 등이 callbacks에서 완료되도록 이것을 리팩터링 할 것입니다.

    이 시점에서 귀하의 create 조치는 실제로 매우 간단하며 컨트롤러를 inherited resources으로 전환 할 수 있습니다.

    도움이 되었기를 바랍니다.

    +0

    응답 해 주셔서 감사합니다. jonnii ... 많이 감사드립니다! 코드를 직접 작성하지는 않았습니다. 단지 디버깅하는 것입니다.하지만 솔루션은 훨씬 더 우아합니다. 또한 문제는 Phusion 여객기와 관련이 있음이 밝혀졌습니다. 필자는 파일의 이전 버전을 'vendors_controller_031610.rb'로 이름을 바꿨습니다. 신속하게 되돌릴 필요가 있었을 때를 대비하여 Phusion이 다시 시작한 후에도 오래된 컨트롤러를 사용하고있는 것으로 나타났습니다. 이전 파일을 삭제하면 문제가 해결됩니다. 이상 하네, 응? – justinbach

    관련 문제