现在我正在尝试概括我的一些代码。到目前为止一切顺利,我写了一些可以动态添加到控制器或模型中的 mixin,以便在遵守 DRY 的同时完成工作。
但是我的“搜索表单助手”遇到了一个角落,现在我有点无能为力。
我有一个 mixin 'SearchIndexController',它添加了在 searchindex 表中搜索数据所需的方法。
包含 mixin 后,我可以在调用此方法的相应控制器中初始化搜索操作:
def init_searchaction(object, name=nil)
singular = object.to_s.classify
plural = singular.pluralize
name = "search_#{singular}".to_sym if name.nil?
unless self.respond_to?(name)
define_method(name) do
# init
success=false
#TODO
# >>> DRAW NEW ROUTE TO THIS ACTION <<<
# evaluate searchform input for Searchindex-Call
needle = params[:query]
success, x, notice = execute_search("#{singular}", needle)
# send selected/filtered data to page
respond_to do |format|
format.js {
render :update do |page|
page.call "sidx_updateSearchResultContentAtIdTag", "##{plural.downcase} tbody", "#{render x}" if success
page.call "sidx_updateNotice", success, "#{notice}"
page.call "sidx_stopSpinner"
end
}
end
end
else
logger.warn("#{__FILE__}:#{__LINE__}:#{self.to_s}: search-action for '#{self.class.name}' can not be created, it already exists!")
end
end
所以可以说我有一个用户控制器。在用户窗体中,我需要搜索多个对象。假设我希望能够搜索用户、部门和客户......使用我的 mixin 我只需要像这样初始化搜索操作:
init_searchaction :user
init_searchaction :department
init_searchaction :client, :find_clients
这些将在包含的控制器中创建被调用的动作
search_user
search_department
find_clients
唯一缺少的是为他们获取路线的方法。我不想预先定义路线。我只想'init_searchaction'并让mixin创建必要的路线。
那么......是否可以通过动态使用 mixins init_searchaction 方法将路由添加到相应的搜索操作?我认为必要的代码将放在上面代码示例中的#TODO 标记处。但是我仍然没有找到如何去做......我的意思是,如果这不可能,我会感到惊讶。
有人知道如何做到这一点吗?提前感谢您提供任何导致解决方案的想法!