1

由于我是 Rails 新手,我无法查明错误。我正在编写一种方法来通过提供 URL 中唯一的 prod_id 来获取数据。我将 URL 作为 localhost:3000/getproducts/PR1.josn 以获取 json 格式的数据。但它显示了一个错误

ActiveRecord::RecordNotFound in GetproductsController#show

Couldn't find Product without an ID

Rails.root: /root/Railsapps/Shopping
Application Trace | Framework Trace | Full Trace

app/controllers/getproducts_controller.rb:12:in `show'

在这里我给我的 getproducts.rb 这是控制器

class GetproductsController < ApplicationController

   def index
    @products = Product.all

    respond_to do |format|
      format.html # index.html.erb
      format.json { render json: @products }
    end
  end
  def show
    @product = Product.find(params[:prod_id]) 
    respond_to do|format|
      format.html  {render show.html.erb}
       format.xml  #{ render :xml => @product }
      format.json {render json:@product}
    end
      end

end

我的模型是product.rb

class Product < ActiveRecord::Base
  attr_accessible :model_name, :brand_name, :prod_id
end

我的 show.html.erb

<p id="notice"><%= notice %></p>

<p>
  <b>Model Name:</b>
  <%= @product.model_name %>
</p>

<p>
  <b>Brand Name:</b>
  <%= @product.brand_name %>
</p>
4

2 回答 2

1

您是否还可以在 config/routes.rb 中编写该 url 的路由?

在您的模型上,您需要告诉 rails 您的主键不是预期的“id”,所以这样做

class Product < ActiveRecord::Base
   set_primary_key :prod_id

   attr_accessible :model_name, :brand_name, :prod_id
end

然后你可以做

Product.find(params[:id])

它应该工作:)

于 2012-12-15T05:31:08.300 回答
0

我认为问题很可能是 Rails 正在获取您提供的参数并假设它被调用id,因此当您要求时prod_id,没有这样的参数。这是 show 动作的默认值 - 假定参数被命名id。然后您尝试通过 params[:prod_id] 查找,它是 nil,因为 params(可能)只是{:id => 'PR1'}.

您可以通过传递params[:id]而不是调用来解决此问题,或者通过修改您的 routes.rb 文件来解决此问题,因此:params[:prod_id]Product.find_by

resources :getproducts, :except => [:show]

get 'getproducts/:prod_id' => 'getproducts#show'

首先,你告诉 Rails 不要使用这个控制器的默认显示路由(这是:except选项)。然后,您定义自己的路由,指定参数的名称。这样,当您调用 时getproducts/PR1,“PR1”将作为params[:prod_id]. 您需要先排除默认值,因为 Rails 将使用第一个匹配的路由,所以只要默认值仍然存在,它就由resources调用定义。

于 2012-12-15T05:21:05.697 回答