在我的应用程序中,我希望用户搜索商店,然后选择他们想要使用的商店。它应该转到一种形式,允许用户向该商店添加新价格,如对文章的评论,但我得到错误:
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
为什么会出现此错误?应该纠正什么?
答案 0 :(得分:1)
实际上,我认为您的路线设置不正确。
如果您想创建价格,具体取决于商店(或执行任何其他休息操作),您应该设置如下路线:
资源:商店 资源:价格 端
因此,您的PricesController
可以通过此网址访问:
stores/:store_id/prices/[:action/[:id]]
在您的设置中,您只是说,您的PricesController
有一个名为create_price
的方法,可以通过stores/:store_id/create_price
的POST请求触发。但是您没有在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
哈希中给出了params
,如果没有给出你想要做的东西没有给定的商店,那么