找到父母然后创建孩子时,正确的路线是什么?

时间:2012-05-16 17:51:21

标签: ruby-on-rails ruby-on-rails-3

在我的应用程序中,我希望用户搜索商店,然后选择他们想要使用的商店。它应该转到一种形式,允许用户向该商店添加新价格,如对文章的评论,但我得到错误:

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

为什么会出现此错误?应该纠正什么?

1 个答案:

答案 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,如果没有给出你想要做的东西没有给定的商店,那么