【问题标题】:How to dynamically add a route to a scoped resource in Rails3?如何在 Rails3 中动态添加路由到作用域资源?
【发布时间】:2011-07-19 12:30:52
【问题描述】:

现在我正在尝试概括我的一些代码。到目前为止一切顺利,我写了一些可以动态添加到控制器或模型中的 mixin,以便在遵守 DRY 的同时完成工作。

但是我的“搜索表单助手”遇到了一个角落,现在我有点不知所措。

我有一个 mixin 'SearchIndexController',它添加了在 searchindex-table 中搜索数据所需的方法。

在包含 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 标记处。但我还没有找到怎么做……我的意思是,如果不可能的话,我会很惊讶。

有人知道如何做到这一点吗?提前感谢您提出解决方案的任何想法!

【问题讨论】:

    标签: ruby-on-rails ruby ruby-on-rails-3 mixins rails-routing


    【解决方案1】:

    您可以围绕标准动态路由添加工作

    match ':controller(/:action(/:id(.:format)))'
    

    将其更改为您的目标并享受 :)

    【讨论】:

    • hmm .. 对于简单的情况,这可以解决问题...但是让我编辑我的问题以使我的问题更加透明...
    • 这里最好的解决方案是让它更简单。我相信你可以在这里简化 70% 的逻辑 :)
    • 第二个建议:将您的搜索逻辑包装到简单的 REST 控制器中,并将所有搜索请求传递给该控制器 - 这是真正的 Rails 方式
    • 更简单:我相信它可能...使用 REST SearchController 搜索:是的,我同意,但现在我的用户有不同的访问级别,这些访问级别是基于控制器控制的。这样如果用户被允许使用特定的控制器,他可以使用相应的search_actions,并且只需要调用一次allow-access-check-logic来查看他是否可以访问e。 G。 'UserController' ...如果我制作了一个 SearchController,我是否必须再次在其中创建整个允许访问检查逻辑?
    猜你喜欢
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    • 1970-01-01
    • 2023-03-08
    • 2017-04-13
    • 2014-07-25
    • 2010-11-20
    • 1970-01-01
    相关资源
    最近更新 更多