【发布时间】:2016-06-24 14:56:47
【问题描述】:
我正在构建一个 Rails 应用程序来学习 Rails 上的 Ruby。(我非常缺乏经验) 我正在尝试在应用中实现搜索栏。
当我点击搜索栏时,会返回此错误 Couldn't find Product with 'id'=search
在这一行
# Use callbacks to share common setup or constraints between actions.
def set_product
@product = Product.find(params[:id])
end
服务器日志显示了这个
Started GET "/products/search?utf8=%E2%9C%93&query=Desk" for ::1 at 2016-06-24 16:02:32 +0000
Processing by ProductsController#show as HTML
Parameters: {"utf8"=>"✓", "query"=>"Desk", "id"=>"search"}
Product Load (0.4ms) SELECT "products".* FROM "products" WHERE "products"."id" = $1 LIMIT 1 [["id", 0]]
Completed 404 Not Found in 4ms (ActiveRecord: 0.4ms)
ActiveRecord::RecordNotFound (Couldn't find Product with 'id'=search):
app/controllers/products_controller.rb:77:in `set_product'
我已经在这个搜索表单上工作了几个小时,并查看了各种教程和 stackoverflow 帖子,试图弄清楚这一点。 我完全迷路了,但解决方案可能很简单。 谁能帮帮我。
这是我在 _navbar.html.erb 中的搜索表单
<div class="input-group">
<%= form_tag search_products_path, method: 'get', class: 'navbar-form' do %>
<%= text_field_tag :query, params[:query], placeholder: "Search", class: "form-control"%>
</div>
<span class="input-group-btn">
<%= submit_tag "Search", class: 'btn btn-default' %>
</span>
<% end %>
这是 products.rb 模型
class Product < ActiveRecord::Base
mount_uploader :image, ImageUploader
validates_presence_of :name, :price, :stock_quantity
validates_numericality_of :price, :stock_quantity
belongs_to :designer
belongs_to :category
belongs_to :page
def self.search(query)
where("name LIKE ? OR description LIKE ?", "%#{query}%", "%#{query}%")
end
end
这是 products_controller.rb
class ProductsController < ApplicationController
before_action :set_product, only: [:show, :edit, :update, :destroy]
before_filter :initialize_cart
before_action :authenticate_admin!, only: [ :new, :edit, :update, :create, :destroy ]
# GET /products
# GET /products.json
def index
@products = Product.all
end
def search
@products = Product.search(params[:query]).order("created_at DESC")
@categories = Category.joins(:products).where(:products => {:id => @products.map{|x| x.id }}).distinct
end
# GET /products/1
# GET /products/1.json
def show
end
# GET /products/new
def new
@product = Product.new
end
# GET /products/1/edit
def edit
end
# POST /products
# POST /products.json
def create
@product = Product.new(product_params)
respond_to do |format|
if @product.save
format.html { redirect_to @product, notice: 'Product was successfully created.' }
format.json { render :show, status: :created, location: @product }
else
format.html { render :new }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /products/1
# PATCH/PUT /products/1.json
def update
respond_to do |format|
if @product.update(product_params)
format.html { redirect_to @product, notice: 'Product was successfully updated.' }
format.json { render :show, status: :ok, location: @product }
else
format.html { render :edit }
format.json { render json: @product.errors, status: :unprocessable_entity }
end
end
end
# DELETE /products/1
# DELETE /products/1.json
def destroy
@product.destroy
respond_to do |format|
format.html { redirect_to products_url, notice: 'Product was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_product
@product = Product.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def product_params
params.require(:product).permit(:name, :description, :price, :image, :category_id, :stock_quantity, :designer_id, :query)
end
end
这是views/products/search.html.erb
<table class="table table-hover">
<thead>
<tr>
<th>Name</th>
<th>Description</th>
<th>Designer</th>
<th>Price</th>
<th>Stock</th>
<th>Image</th>
</tr>
</thead>
<tbody>
<% @products.each do |product| %>
<tr>
<td><%= link_to product.name, product %></td>
<td><%= product.description %></td>
<td><%= product.designer.designer_name %></td>
<td><%= number_to_currency product.price %></td>
<td><%= product.stock_quantity %></td>
<td><%= image_tag product.image.thumb %></td>
<% end %>
</tr>
</tbody>
在 routes.rb 我有
Rails.application.routes.draw do
post 'products/search' => 'products#search', as: 'search_products'
get 'pages/index'
get 'pages/about'
get 'pages/location'
get 'pages/stockists'
devise_for :users
resources :categories
resources :categories
resources :designers
resources :category_names
resources :products
resource :cart, only: [:show] do
post "add", path: "add/:id", on: :member
get :checkout
end
resources :orders, only: [ :index, :show, :create, :update ] do
member do
get :new_payment
post :pay
end
end
root 'pages#index'
end
【问题讨论】:
标签: ruby-on-rails ruby search