1

我正在尝试遵循Simple Search Form。尽管看起来微不足道,但我无法让它发挥作用。我基本上有以下设置:

应用程序.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_path指的是index动作而不是show动作。

如果您可以确定要“显示”的单个产品,则应改为执行搜索的代码,index然后执行重定向到。show

至于重定向,假设您有一个搜索结果(或正在为用户选择一个),您可以show使用以下命令重定向到该页面:

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

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

现在,您需要处理另外两种情况: 1. 如果没有产品怎么办?2. 如果产品不止一种怎么办?

两者都可以通过您的索引操作作为一般搜索结果页面进行处理。

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

您应该对索引操作执行搜索,而不是显示操作。因此,将@products = Product.search(params[:search])行移动到索引操作。另请注意,您的表单路径products_path是在 index 操作中提交请求。希望这可以帮助

于 2013-03-07T16:41:18.313 回答