3

現在、コードの一部を一般化しようとしています。ここまでは順調に進んでおり、DRY に従いながら物事を成し遂げるために、コントローラまたはモデルに動的に追加できるいくつかの mixin を作成しました。

しかし、私の「Searchform-Helper」で、私は今、少し無知なところに行き着きました。

searchindex-table 内のデータを検索するために必要なメソッドを追加する mixin 'SearchIndexController' があります。

ミックスインを含めた後、このメソッドを呼び出して、対応するコントローラー内で検索アクションを初期化できます。

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

だから私はユーザーコントローラーを持っているとしましょう。ユーザーフォーム内で、いくつかのオブジェクトを検索する必要があります。ユーザー、部門、およびクライアントを検索できるようにしたいとしましょう...私のミックスインでは、次のように検索アクションを初期化する必要があります。

init_searchaction :user
init_searchaction :department
init_searchaction :client, :find_clients

これらは、呼び出されるインクルードコントローラー内でアクションを作成します

search_user
search_department
find_clients

欠けている唯一のものは、彼らのためのルートを取得する方法です. 事前にルートを定義する必要はありません。「init_searchaction」して、ミックスインに必要なルートを作成させたいだけです。

それで...ミックスインinit_searchactionメソッドを動的に使用して、accoring search-actionにルートを追加することは可能でしょうか? 必要なコードは、上記のコード例の #TODO マークに配置されると思います。でも、まだやり方が分からない…というか、出来なかったらビックリですよね。

誰でもこれを行う方法について考えがありますか? 解決策につながるアイデアをお寄せいただきありがとうございます。

4

1 に答える 1

1

標準動的ルートの回避策を追加できます

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

それをあなたの目標に変えて楽しんでください:)

于 2011-03-27T17:35:07.973 に答える