1

Simple Search Formに従おうとしています。些細なことのように思えますが、私はそれを機能させることができません。私は基本的に次の設定をしています。

application.html.erb

<%= form_tag products_path, method: :get do %>
            <p>
              <%= text_field_tag :search, params[:search] %>
              <%= submit_tag "Search", title: nil %>
            </p>
        <% end %>

prodcut_controlle.rb

    def index
    @products = Product.search(params[:search])
    respond_to do |format|
      format.html
      format.json { render json: @products }
    end
  end


  def show
    @product = Product.find(params[:id])
    @cart = current_cart #Get current cart

    respond_to do |format|
      format.html
      format.json { render json: @product }
    end
  end

製品.rb*

  def self.search(search)
    if search
      find(:all, :conditions => ['title LIKE ?', "%#{search}%"])
    else
      find(:all)
    end
  end

私が効果的に目指しているのは、ユーザーが特定のproductものを検索すると、製品にリダイレクトされることです。この場合、products showそれは私が入れた理由です@products = Product.search(params[:search])。とても基本的なことを達成するにはどうすればよいですか -.-

4

2 に答える 2

0

ルートが非常に珍しい場合を除き、フォーム内のタグproducts_pathindexアクションではなくアクションを参照しますshow

代わりに検索を行うコードを入力し、「表示」する単一の製品を特定できる場合indexはリダイレクトを実行する必要があります。show

リダイレクトに関しては、単一の検索結果がある (またはユーザーのために 1 つを選択している) と仮定すると、次の方法でそのshowページにリダイレクトできます。

product = @products.first // Somehow you're choosing one of your @products here

respond_to do |format|
  format.html { redirect_to product }
  //...
end

ここで、対処する必要があるのは、さらに 2 つのケースです。1. 製品がない場合はどうなりますか? 2. 商品が複数ある場合は?

どちらも、一般的な検索結果ページとして index アクションで処理できます。

respond_to do |format|
  format.html do
    if @products.blank? || @products.size > 1
      render :action => "index"
    else
      redirect_to @products.first
    end
  end
  // ...
end

実際のシステムでは、「単一の製品を持っているか」という質問全体を独自の関数に入れますが、うまくいけば、これで正しい方向に進むことができます。

== ドキュメント

リダイレクト

与える

于 2013-03-07T16:40:10.843 に答える
0

show アクションではなく index アクションで検索を実行する必要があります。@products = Product.search(params[:search])そのため、行をインデックス アクションに移動します。products_pathまた、フォーム パスが index アクションでリクエストを送信していることにも注意してください。お役に立てれば

于 2013-03-07T16:41:18.313 に答える