9

まず、RoRは初めてなので、答えは明らかかもしれませんが、その場合はお詫び申し上げます。私は周りを見回しましたが、役立つものは何も見つかりませんでした。

アプリのすべてのウェブページのヘッダーに、すべての「バケット」の名前を検索する検索フォームを配置しようとしています。関連するコードは次のとおりです。

app / views / layouts / _header.html.erb(ナビゲーションバー内):

<% search_form_for @q do |f| %>
  <%= f.label :name_cont %>
  <%= f.text_field :name_cont %>
  <%= f.submit %>
<% end %>

app / controllers /buckets_controller.rb内:

def index
  unless params[:q].blank?
    @q = Bucket.search(params[:q])
    @buckets = @q.result.paginate(:page => params[:page])
  else
    @buckets = Bucket.find(:all, :limit => 5).paginate(:page => params[:page])
  end
end

最後の部分はそれほど素晴らしいものではないことを理解しています。私がやろうとしているのは、バケットのインデックスページにアクセスしているだけの場合(検索ではなく)、最近作成された5つのバケットを表示することです。ヘッダーフォームで何かを検索すると、インデックスページにアクセスしますが、検索にヒットしたバケットのみが表示されます。(検索ページをインデックスページとは別にするために、それを処理するためのより良い方法はありますか?)

この問題はほとんど同じであることがわかりましたが@q、すべてのページにフォームが含まれる場合の処理​​方法がわかりません。確かに、すべてのコントローラーのすべてのアクションを変更する必要はありませんか?

欲求不満を前もって申し訳ありません。

4

3 に答える 3

10

他の人が言ったように、ApplicationController の before_filter を利用する必要があります。ernie 自身はこれを推奨していないようですが、実装は簡単です。

まず、高度な Ransack オプションを使用して、検索用のパスを設定します。

#config/routes.rb
  resources :buckets do
    collection do
      match 'search' => 'buckets#search', via: [:get, :post], as: :search
    end
  end

次に、BucketsController を更新して、次のカスタム アクションを含めます。

#controllers/buckets_controller.rb
  def search
    index
    render :index
  end

異常なことはまだ何もありません。現在検索しようとすると、元の質問からエラーが発生します。変数 q の定義は正しく実装されていますが、次のように ApplicationController に移動する必要があります。

#controllers/application_controller.rb
before_filter :set_global_search_variable

  def set_global_search_variable
    @q = Bucket.search(params[:q])
  end

最後に、正しい検索オプションを渡すように検索フォームを更新します

#layouts/_header.html.erb

    <% search_form_for @q, url: search_buckets_path, html: { method: :post }  do |f| %>
      <%= f.label :name_cont %>
      <%= f.text_field :name_cont %>
      <%= f.submit %>
    <% end %>
于 2013-11-12T12:51:05.263 に答える
1

いいえ、すべてのコントローラーを編集する必要はありません。

ApplicationControllerは、すべての「一般的な」コントローラーのニーズに使用できます。ガイドhttp://guides.rubyonrails.org/action_controller_overview.htmlおよびAPIドキュメントhttp://api.rubyonrails.org/classes/ActionController/Base.htmlでそれを読んでください。

ここで重要なのは、新しいRailsアプリを生成すると、ファイル... / app / controllers / action_controller.rbが作成され、そのクラスがActionController::Baseから派生していることに気付くでしょう。次に、再びrailsジェネレーターを使用してアプリのコントローラーを作成すると、新しいコントローラークラスがApplicationController(:: Baseではない)から派生していることがわかります。これは、application_controller.rbがアプリの親コントローラークラスであることを意味します。つまり、その中のすべてがすべてのアプリコントローラーで利用できるということです。悪用しやすいので、慎重に行ってください。

于 2012-05-10T11:40:18.203 に答える
1

これは不可能のようです。これはgem作者のErnieからのコメントです。

ビューのパーシャル自体で、Ransack が必要なものを before_filter または (ick) で処理する必要があります。サイトのすべての部分に検索フィールドを配置する場合は、ランサックがその目的に適したツールであるかどうかも検討することをお勧めします。sphinx、solr などの逆インデックス検索設定が必要になる場合があります。

https://github.com/ernie/ransack/issues/3

于 2012-11-17T19:57:54.083 に答える