[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.문제는 실제로 RoR에이 대중화 MVC의 잘못된 해석에 의해 발생합니다.
문제는 실제로 RoR에이 대중화 MVC의 잘못된 해석에 의해 발생합니다.
이것은 제어기의 파열을 일으키는 두 개의 요소의 조합이다 :
이 두 가지 요인은 내가 RoR에 심지어 MVC 프레임 워크 아니라는 것을, 주장 유혹하고 이유가 될 것입니다. 그 결과 패턴은 가까운 모델 - 뷰 - 발표자 사실이다. 이 점에 단순화되어 있어도되는이 우려의 분리를 파괴하기 시작합니다.
-
==============================
2.로직의 대부분은 컨트롤러에 속하지 않습니다. 이 컨트롤러의 책임은 출력 (귀하의 의견)에 넥타이 입력 (HTTP 요청과 해당 매개 변수)이다. 사운드를 귀하의 경우, 그것은처럼 보이는 - 다른 모든 모델에서 구현해야 비즈니스 로직이다. 당신의 블록, 예를 들면,한다면 좋은 후보의 각 Sound 클래스의 인스턴스 방법으로 구현합니다. 당신은 자신이 (lib 디렉토리 아래) 모듈에서이를 구현, 다양한 모델에 걸쳐합니다 (AWS 스토리지 비트 등) 코드를 재사용 발견하고 그 모델에 해당 모듈을 포함합니다.
로직의 대부분은 컨트롤러에 속하지 않습니다. 이 컨트롤러의 책임은 출력 (귀하의 의견)에 넥타이 입력 (HTTP 요청과 해당 매개 변수)이다. 사운드를 귀하의 경우, 그것은처럼 보이는 - 다른 모든 모델에서 구현해야 비즈니스 로직이다. 당신의 블록, 예를 들면,한다면 좋은 후보의 각 Sound 클래스의 인스턴스 방법으로 구현합니다. 당신은 자신이 (lib 디렉토리 아래) 모듈에서이를 구현, 다양한 모델에 걸쳐합니다 (AWS 스토리지 비트 등) 코드를 재사용 발견하고 그 모델에 해당 모듈을 포함합니다.
-
==============================
3.그 모든 모델 (또는 라이브러리 모듈)로 리팩토링 작은 기능으로 나눌 수 있어야 같습니다. 다음 개별적으로 작은 부분을 테스트하는 단위 테스트를 설정할 수 있기 때문에 이에 대한 가장 좋은 이유입니다. 컨트롤러는 단순히 모델을 인스턴스화하고 브라우저에 데이터를 반환 할 필요가있다.
그 모든 모델 (또는 라이브러리 모듈)로 리팩토링 작은 기능으로 나눌 수 있어야 같습니다. 다음 개별적으로 작은 부분을 테스트하는 단위 테스트를 설정할 수 있기 때문에 이에 대한 가장 좋은 이유입니다. 컨트롤러는 단순히 모델을 인스턴스화하고 브라우저에 데이터를 반환 할 필요가있다.
from https://stackoverflow.com/questions/11984405/ruby-on-rails-best-practices-big-controller-vs-small-controller by cc-by-sa and MIT license
'RUBY-ON-RAILS' 카테고리의 다른 글
[RUBY-ON-RAILS] CORS - JSONP없이 도메인 간 AJAX 기원 서버를 허용함으로써 (0) | 2020.02.20 |
---|---|
[RUBY-ON-RAILS] 어떻게이 인스턴스를 레일 로컬 포트가 실행되고 찾는 방법은? (0) | 2020.02.20 |
[RUBY-ON-RAILS] 루비 레일에 : form_for의 인수로 상징 (0) | 2020.02.20 |
[RUBY-ON-RAILS] PG : UndefinedTable : 오류 : 관계 "..."존재하지 않는 (0) | 2020.02.20 |
[RUBY-ON-RAILS] 레일 3.1과 루비 1.9.3p125 : 루비 debug19 여전히 "기호를 찾을 수 없습니다 : _ruby_threadptr_data_type"로 충돌 [중복] (0) | 2020.02.20 |