복붙노트

[RUBY-ON-RAILS] 레일 모범 사례에 루비 - 작은 컨트롤러 대 빅 컨트롤러

RUBY-ON-RAILS

레일 모범 사례에 루비 - 작은 컨트롤러 대 빅 컨트롤러

나는 많은 것들을해야 할 특히 컨트롤러와 루비 온 레일즈의 모범 사례에 대한 몇 가지 정보를 필요로하므로, 단순한 "쇼"액션은 지금까지 선이다. 나는 정말 좋지 않다, 알고, 나는 그것이 특정 코드가 있습니다.

다음은 샘플 코드는 다음과 같습니다

def show
    sound = Sound.find(params[:id])
    @xml_path = File.dirname(sound.file.path)
    s3 = AWS::S3.new(
        :access_key_id => 'XXX',
        :secret_access_key => 'XXX')
    @url = s3.buckets['dev'].objects[sound.file.path[1..-1]].url_for(:read, :expires => 10*60)

    if sound.id_job != 0 && sound.transcript_progress != 100
      @response = Savon.client("http://srap.php?wsdl").request(:avance) do
        soap.body = { 
         :Jeton => "abcdef",
         :ID_job => sound.id_job,
        }
      end
      @response = @response.to_hash
      @progress = @response[:avance][:avancement].to_s.split("#")[1]# ID_job received is formed like "OK#123", we keep "123"
      if @progress == "Termine"
         sound.transcript_progress = 100
      elsif @progress == "ERROR"
        flash.now[:alert] = "Oups, il semblerait que le fichier soit illisible, ou qu'il n'y ait rien a ecouter !"
      elsif @progress != "Queued"
        sound.transcript_progress  = @response[:avance_response][:avancement].to_s.split("#")[2].split("%")[0].to_i
      end
      sound.save
    end

    if sound.transcript_progress == 100 # If transcription finished
      # Get XML File URL on the FTP
      @xml_path = Savon.client("http://srap.php?wsdl").request(:donneResultat) do
      soap.body = { 
       :Jeton => "XXX",
       :FichierSon => sound.id_job
      }
      end

      # Parse XML Path URL on Kimsufi
      @xml_path = @xml_path.to_hash[:donne_resultat_transposition_response][:chemin_fichier].to_s.split("#")[2].to_s.split("/")[5]


      # Create local directory (/tmp/sounds) for XML Temp Save
      if ! File.directory?(Rails.root.to_s + '/tmp/sounds')
        Dir.mkdir(Rails.root.to_s + '/tmp/sounds')
      end
      # Get XML from FTP
      ftp=Net::FTP.new                                     
      ftp.connect("ftp.com", 21)                                                         
      ftp.login("XXX", "XXX")                
      if ftp.closed?
        flash.now[:alert] = "Oups, il semblerait qu'il y ait eu un problème ! Merci d'actualiser la page"
      else  
        ftp.passive = true
        ftp.chdir('results')
        ftp.getbinaryfile(@xml_path, Rails.root.to_s + '/tmp/sounds/' + @xml_path)
        ftp.close
      end

      # Send XML on S3
      s3 = AWS::S3.new(
        :access_key_id => 'XXX',
        :secret_access_key => 'XXX')
      @xml_new = (File.dirname(@sound.file.path) + '/' + File.basename(@xml_path))[1..-1]
      s3.buckets['dev'].objects[@xml_new].write(Pathname.new(Rails.root.to_s + '/tmp/sounds/' + @xml_path))
      @file = s3.buckets['dev'].objects[@xml_new].read()
    end


    # A lot of logic again, i've not did it yet

  end

당신이 볼 수 있듯이, 나는 여기 로직을 ​​많이 가지고 나는 전사가 이상인지 확인해야      하지 않는 경우는 PROGRESS_BAR를 업데이트 (@ sound.transcript_progress)      그래, 내가 먼저 아마존 S3에 다음의 XML 경로를 얻을 수있는 비누 행동에 연결 FTP를 통해 XML을 얻을, 다음을 재고해야 (거지 같은 SOAP, 나는 ... 모든 응답을 재분석해야합니다).

해결법

  1. ==============================

    1.문제는 실제로 RoR에이 대중화 MVC의 잘못된 해석에 의해 발생합니다.

    문제는 실제로 RoR에이 대중화 MVC의 잘못된 해석에 의해 발생합니다.

    이것은 제어기의 파열을 일으키는 두 개의 요소의 조합이다 :

    이 두 가지 요인은 내가 RoR에 심지어 MVC 프레임 워크 아니라는 것을, 주장 유혹하고 이유가 될 것입니다. 그 결과 패턴은 가까운 모델 - 뷰 - 발표자 사실이다. 이 점에 단순화되어 있어도되는이 우려의 분리를 파괴하기 시작합니다.

  2. ==============================

    2.로직의 대부분은 컨트롤러에 속하지 않습니다. 이 컨트롤러의 책임은 출력 (귀하의 의견)에 넥타이 입력 (HTTP 요청과 해당 매개 변수)이다. 사운드를 귀하의 경우, 그것은처럼 보이는 - 다른 모든 모델에서 구현해야 비즈니스 로직이다. 당신의 블록, 예를 들면,한다면 좋은 후보의 각 Sound 클래스의 인스턴스 방법으로 구현합니다. 당신은 자신이 (lib 디렉토리 아래) 모듈에서이를 구현, 다양한 모델에 걸쳐합니다 (AWS 스토리지 비트 등) 코드를 재사용 발견하고 그 모델에 해당 모듈을 포함합니다.

    로직의 대부분은 컨트롤러에 속하지 않습니다. 이 컨트롤러의 책임은 출력 (귀하의 의견)에 넥타이 입력 (HTTP 요청과 해당 매개 변수)이다. 사운드를 귀하의 경우, 그것은처럼 보이는 - 다른 모든 모델에서 구현해야 비즈니스 로직이다. 당신의 블록, 예를 들면,한다면 좋은 후보의 각 Sound 클래스의 인스턴스 방법으로 구현합니다. 당신은 자신이 (lib 디렉토리 아래) 모듈에서이를 구현, 다양한 모델에 걸쳐합니다 (AWS 스토리지 비트 등) 코드를 재사용 발견하고 그 모델에 해당 모듈을 포함합니다.

  3. ==============================

    3.그 모든 모델 (또는 라이브러리 모듈)로 리팩토링 작은 기능으로 나눌 수 있어야 같습니다. 다음 개별적으로 작은 부분을 테스트하는 단위 테스트를 설정할 수 있기 때문에 이에 대한 가장 좋은 이유입니다. 컨트롤러는 단순히 모델을 인스턴스화하고 브라우저에 데이터를 반환 할 필요가있다.

    그 모든 모델 (또는 라이브러리 모듈)로 리팩토링 작은 기능으로 나눌 수 있어야 같습니다. 다음 개별적으로 작은 부분을 테스트하는 단위 테스트를 설정할 수 있기 때문에 이에 대한 가장 좋은 이유입니다. 컨트롤러는 단순히 모델을 인스턴스화하고 브라우저에 데이터를 반환 할 필요가있다.

  4. from https://stackoverflow.com/questions/11984405/ruby-on-rails-best-practices-big-controller-vs-small-controller by cc-by-sa and MIT license