我正在尝试关注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
Product.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])
,这就是我放{{1}}的原因。我如何实现如此基本的东西-.-
答案 0 :(得分: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
在一个真实的系统中,我会把整个“我有一个单一的产品”问题放到它自己的功能中,但希望这会让你朝着正确的方向前进。
==文档
答案 1 :(得分:0)
您应该执行搜索索引操作而不是显示操作。因此,将@products = Product.search(params[:search])
行移至索引操作。另请注意,您的表单路径products_path
正在通过索引操作提交请求。希望这有帮助