0

在我的应用程序中,我想让用户搜索商店,然后选择他们想要使用的商店。它应该转到一个表单,该表单允许用户向该商店添加新价格,就像对文章的评论一样,但我得到了错误:

ActiveRecord::RecordNotFound in PricesController#new

Couldn't find Store without an ID

这些是我的联想:

class User
  has_many :prices

class Store
  has_many :prices

class Price
  belongs_to :user
  belongs_to :store

因此,当用户选择一个商店时,它应该去price/new并知道正在使用的商店的 ID。也许是这样的:

<%= form_for @price, :url => create_price_store_path(@store) do |f| %>
...
<% end %>

然后我正在使用的操作:

class PricesController

  def select_store
    # Find the store using sunspot search
    @search = Store.search do |s|
      s.fulltext params[:search] unless params[:search].blank?
      s.paginate(:per_page => 5, :page => params[:page])
    end
    @stores = @search.results
  end

  def new
    @store = Store.find(params[:id])
    @price = Price.new
  end
end

然后我的路线到目前为止:

resources :stores do
  member do
   post :create_price
  end
end

resources :prices do
  collection do
    get :select_store
  end
end

为什么我会收到此错误?应该纠正什么?

4

1 回答 1

1

实际上,我认为您的路线设置不正确。

如果您想根据商店创建价格(或执行任何其他安静的操作),您应该像这样设置您的路线:

资源:商店做资源:价格结束

因此,您PricesController可以通过以下网址访问:

stores/:store_id/prices/[:action/[:id]]

在您的设置中,您只是说,您PricesController有一个名为的方法create_price,可以通过 POST 请求 trhough 触发stores/:store_id/create_price。但是您没有在您的PricesController(至少没有在您提供的代码段中)定义此方法

因此,如果您正在做嵌套资源,正如我在上面所写的,您可以拥有PricesController如下:

PricesController
  def new
    @store = Stores.find(params[:store_id])
    @price = @store.build   # this builds the Price object based on the store
  end

  def create
    # depending if your model uses `accepts_nested_attributes_for`
  end
end

希望这是您正在寻找的解释:)

更新:我忘了提到的是,如果您希望在PricesController没有给定商店的情况下也可以访问您的商店(因为您在resources :prices上面写过,我假设您这样做了),如果在哈希:store_id中给出a,您需要检查您的控制器params,如果不做你想做的事情,没有给定的商店)

于 2012-05-16T20:54:22.757 回答