코드 중복을 제거하기 위해 모델과 컨트롤러를 리팩토링했으며 지금까지는 모든 것이 복숭아 같았습니다. 이 경우 (컨트롤러 이름을 기반으로 모델을 쿼리하는 방법
def process_filters
# Filter hash we're going to pass to the model
filter_to_use = {}
# To process filters, we first query the model to find out what filters
# we should be looking for, as the model knows what we can filter.
Iso.available_filters.each do |filter|
# We should have our array with our filter listing.
# Check the purchase order model for a description
filter_name = filter[0][:filter_name]
# Filters are stored in a session variable, this way filters survive
# page reloads, etc. First thing we do, is set the session if new filters
# have been set for the filter.
session_name = session_filter_name(filter_name)
if params[session_name]
if params[session_name] == 'All'
session[session_name] = nil
else
session[session_name] = params[session_name]
filter_to_use[filter_name] = params[session_name]
end
elsif session[session_name]
# If params aren't read, we still need to filter based off the users
# session
filter_to_use[filter_name] = session[session_name]
end
end
# Just using this variable for now until I can refactor the helper code
# so that this is passed in.
@current_filter_values = filter_to_use
filter_to_use[:page] = @current_page
@isos = Iso.find_filtered(filter_to_use)
if @isos.out_of_bounds?
filter_to_use[:page] = session[:previous_page] = @current_page = 1
@isos = Iso.find_filtered(filter_to_use)
end
end
이제이 코드는 모델 참조를 제외하고, 정확하게 다른 컨트롤러의 코드와 동일합니다 : 현재 나는 나의 컨트롤러의 두 개의 공통 그래서 같은 코드의 비트를 가지고있어 이소). 그 모델 참조를 동적으로 만들 수있는 방법이 있습니까?
기본적으로 Iso 참조 (@iso 변수 포함)를 controller.controller_name 또는 유사한 것을 기반으로 대체하고 싶습니다.
Ahhh, Kernel.const_get은 내가 알아야 할 필요가 있다고 생각합니다. 감사! – Mike