2012-03-16 2 views
1

컨트롤러에서 if 문을 사용할 수 있습니까? 아니면 나쁜 습관입니까? TracksController 모두 생성하고 파괴하는 내 행동에레일 컨트롤러에 문이 있다면?

,이 같은 것을하고 싶지 :

if Product 
@product = Product.find(params[:product_id]) 
@track = @product.tracks.create(params[:track]) 

eslif Release 
@Release = Release.find(params[:release_id]) 
@track = @release.tracks.create(params[:track]) 
end 

이 작업을 수행 할 수있는 더 나은 방법이 있나요?

답변

1

나는 더 가서 before_filter에 더 DRY 방식 좋을 것 :

class TracksController < ApplicationController 
    before_filter :get_track_parent, only: [ :create, :destroy ] 

    def create 
    @track = @parent.tracks.create(params[:track]) 
    ... 
    redirect_to @parent 
    end 

    private 

    def get_track_parent 
    if params[:product_id].present? 
     @parent = Product.find(params[:product_id]) 
    elsif params[:release_id].present? 
     @parent = Release.find(params[:release_id]) 
    end 
    end 
end 

우리가 모델 관계에 대한 컨텍스트를 받았다 때문에 부모를 사용을하지만 공통점을 설명하는 더 나은 용어가있다 가정 릴리스와 제품 트랙 사이.

+0

감사합니다. 이것은 많은 의미가 있습니다. 지금 구현하겠습니다. – Raoot

+0

이 방법을 사용하여 리디렉션에 문제가있는 것을 제외하고는 제대로 작동하는 것 같습니다. if 및 elsif 구문에는 'redirect_to product_path (@product)'또는 'redirect_to release_path (@release)'가 포함되어 있습니다. DRY 방식으로 이들을 추가하는 가장 좋은 방법은 무엇입니까? – Raoot

+0

이러한 메소드를 사용하면 redirect_to에 변수를 제공하기 만하면됩니다 :'redirect_to @ parent' – Vapire

3

나는 before_filter 콜백을 통해 그것을 할 것입니다 : 당신이 당신의 생성과 파괴 방법에 @track 인스턴스 변수를 가지고 있음을 보장 것이 설정에 따라서

class TracksController < AC 
    before_filter :ensure_track, :only => [ :create, :destroy ] 

    private 

    def ensure_track 
    if Product 
     @product = Product.find(params[:product_id]) 
     @track = @product.tracks.create(params[:track]) 
    elsif Release 
     @release = Release.find(params[:release_id]) 
     @track = @release.tracks.create(params[:track]) 
    end 
    end 
end 

ensure_track의 원인은 두 가지 방법 전에 호출됩니다 .

논리를 적용하는 것이 의미가있는 경우 ... Product이라는 상수가 있는지 테스트하고 왜 Release이라는 상수가 없는지 왜 테스트하고 싶습니까? 질문은 params[:product_id] 또는 params[:release_id]이 있으면 어떨까요? 필터에 대한 Rails Action Controller Guide 참조 :

는하지만 다른 질문 :

UPDATE입니다.

+0

감사합니다. 내가 이것을 이해할 지 모르지만 나는 그것을 시도 할 것이다. 논리에 관해서; 나는 기본적으로 Release & Tracks 및 Product_Tracks HABTM associations/tables에 기록 된 트랙을 가지고있는 Release & Product 모델을 가지고 있습니다. 이제 나는 이걸 가지고 있는데, 실제로 다른 접근 방식을 취해야하고 Polymorphic 연관을 사용해야하는지 궁금해합니다. – Raoot

+0

나는 ... 다형성 관계가 여기에 의미가 있다고 생각한다. 하지만 위의 if 문은 항상 기본값으로 설정됩니다. 네임 스페이스에 'Product'라는 이름의 상수가 항상 있기 때문에 elsif-path에는 절대 들어 가지 않습니다 ... – Vapire

+0

아, 필터 작동 방식을 이해합니다. 지금. 이전에 다형성 연관을 사용하지 않은 이유를 기억했습니다. 제품이 만들어지면 상위 릴리스와 관련된 트랙을 상속받으며 제품 레벨에서 트랙 목록을 수정하고 개별 제품에만 기능을 추가하는 '보너스'트랙을 추가 할 수 있어야합니다. 그래서, 나는 원래의 접근법이 내가 필요로하는 것이라고 생각하는 것으로 돌아 왔습니다. if 문을 작동 시키면됩니다. – Raoot

관련 문제