В моем приложении есть bazillion контроллеров, и мне было интересно, как использовать метапрограммирование, чтобы облегчить обслуживание без головной боли.Это работает, но оно сопровождается опасностью в форме eval:
def plural_action(method_name)
class_name = self.class.to_s.gsub( %r{^(\w*)Controller} ) {|s| $1 }
@title = "#{method_name.to_s.titlecase} of #{class_name}"
eval "@q = #{class_name.singularize}.where(:client_id => current_user.client_id).search(params[:q])"
eval "@#{class_name.downcase} = @q.result(:distinct => true).paginate(:page => params[:page])"
eval "session[:query] = @#{class_name.downcase}.map(&:id)"
eval "respond_with(@#{class_name.downcase})"
end
Могу ли я сделать это без использования eval?Я возился с instance_variable_set, send и const_get, но пока не повезло.
Вот пример того, что я бы хотел, чтобы метод был оценен.
def index
@title = "Index of Books"
@q = Book.where(:client_id => current_user.client_id).search(params[:q])
@books = @q.result(:distinct => true).paginate(:page => params[:page])
session[:query] = @books.map(&:id)
respond_with(@books)
end