2011-02-12 8 views
1

모델이 있습니다. has_many : 하위 범주왜 우리는 다음을 전달해야합니까?

Ajax를 사용하여보기에서 범주 값에 따라 하위 범주 드롭 다운 값을 채우는 코드를 사용하고 있습니다. 여기에 코드입니다 :

_form.html.erb는

<%= f.select :category_id, @categories, {}, :tab_index => 4, :onchange => "#{remote_function(:url => {:action => "populate_subcategories"}, 
                :with => "'category_id='+value")}" %> 
<div id = "subcategories_div"> 
    <%= render :partial => "subcategories", :object => @subcategories %> 
</div> 

deals_controller.rb

def new 
    @deal = Deal.new 
    @categories = Category.all.map { |category| [category.name, category.id]} 
    @subcategories = @categories.first.subcategories.map { |subcategory| [subcategory.name, subcategory.id] } 
end 

def populate_subcategories 
    subcategories = Subcategory.where(:category_id => params[:category_id]).map { |subcategory| [subcategory.name, subcategory.id] } 

    render :update do |page| 
    page.replace_html 'subcategories_div', :partial => 'subcatgories', :object => subcategories 
    end 
end 

그리고 마지막으로 내 질문에,이다

<%= f.select :subcategory_id, subcategories, {}, :tab_index => 5 %> 

_subcategories.html.erb 코드 page.replace_html 'subcategories_div', :partial => 'subcatgories', :object => subcategories 왜 우리는 지역 변수로 하위 범주를 정의하고 그것을 객체로 객체에 전달 하는가? 진짜야? 이 레일에서 일반 뷰의 경우와 같이 부분에서 사용할 수 있도록 우리는 인스턴스 변수로이

def populate_subcategories 
    @subcategories = Subcategory.where(:category_id => params[:category_id]).map { |subcategory| [subcategory.name, subcategory.id] } 

    render :update do |page| 
    page.replace_html 'subcategories_div', :partial => 'subcategories' 
    end 
end 

사용 @subcategories처럼 쓸 수 있었다. _subcategories.html.erb

<%= f.select :subcategory_id, @subcategories, {}, :tab_index => 5 %> 

및 _form.html.erb에서의 또

<div id = "subcategories_div"> 
    <%= render :partial => "subcategories" %> 
</div> 

이유는 첫 번째 방법은 두 번째 선호 되는가? 부분 변수로 전달할 변수가 하나뿐이기 때문에 그렇습니까? 첫 번째 방법에 대한 성능 향상이 있습니까?

답변

2

이유는 부분 데이터가 뷰와 코드 독립적이어야하기 때문입니다. @subcategories를 사용하면 불필요한 뷰와 부분 뷰 간의 종속성을 생성 할 수 있습니다. 즉, 동일한 부분을 다시 사용하려면 @ 하위 범주가 정의되어 있는지 확인해야하며 그렇지 않을 수도 있습니다. 예를 들어 @my_subcategories 또는 @filtered_subcategories 만 정의 할 수 있습니다. 더 나쁜 경우 @subcategories 및 @filtered_subcategories가있을 수 있으며 동일한 부분을 사용하여 둘 다 표시 할 수 있습니다. 이 경우 하위 변수를 설정하는 인스턴스 변수 대신 하위 범주로 전달하는 것이 좋습니다. 그렇게하면 부분 부분이 실제로 모듈화되고 객체 지향적 인 캡슐화 원칙을 준수하게됩니다. 예를 들어

: 당신이 정상적으로 파셜에 인스턴스 변수의 이름을 지정할 수 있습니다

<h1><%= My Subcategories %></h1> 
render :partial => 'subcatgories', :object => @my_subcategories 
<h1><%= Other Subcategories %></h1> 
render :partial => 'subcatgories', :object => @other_subcategories 
+0

좋아 :object => @hashtags을 통해 우수한 가독성을 가지고 있다고 생각합니다, 나는, 감사합니다 그것을 얻을 – rubyprince

+0

@ (이 [질문] 볼 pan..can http://stackoverflow.com/questions/5247886/rails-query-through-association-limited-to-recent-recent-record/5250758 # 5250758) .. – rubyprince

1

,

render 'subcatgories', :subcategories => @hashtags 

또는

다음
render 'subcatgories', :subcategories => @legals 

당신이로 바르를 사용하여, 당신의 부분에 subcategories을 사용할 수 있습니다 그 이름처럼 위장한

가서 ActionView::Rendering#render

더 많은 매개 변수가있는 동일한 동작을 얻기 위해 양식이 ...(:partial => 'subcatgories', :locals => {:subcategories => @hashtags})

내가 :subcategories => @hashtags

관련 문제