Rails - 路由错误'没有路由匹配[PUT]'

时间:2013-06-04 09:29:27

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

我正在尝试制作一个允许用户创建销售的小应用。有一个用户模型产品型号和照片模型。用户有很多产品,产品有很多照片。但由于某些原因,在我尝试创建产品页面后,我收到了此错误。

路由错误

No route matches [PUT] "/products"

的routes.rb

  resources :products
  resources :photos

产品控制器

  def new 
    @product = Product.new
    @photo = Photo.new
  end

  def create
    @product = current_user.products.build(params[:product])
    @photo = current_user.photos.new(params[:photo])

    if @product.save && @photo.save
      @photo.product_id = @product.id
      render "show", :notice => "Sale created!"
    else
      render "new", :notice => "Somehting went wrong!"
    end
  end

  def show
    @product = Product.find(params[:id]) 
  end

新产品页面(HAML)

%h1 
  create item

= form_for @product,:url => products_path, :html => { :multipart => true } do |f|          
  %p
    = f.label :name
    = f.text_field :name

  %p
    = f.label :description
    = f.text_field :description        
    = f.text_field :ship_price

  %p
    = fields_for :photo, :html => {:multipart => true} do |fp|
    = fp.file_field :image  

  %p.button
    = f.submit

佣金路线

       products GET    /products(.:format)               products#index
                POST   /products(.:format)               products#create
    new_product GET    /products/new(.:format)           products#new
   edit_product GET    /products/:id/edit(.:format)      products#edit
        product GET    /products/:id(.:format)           products#show
                PUT    /products/:id(.:format)           products#update
                DELETE /products/:id(.:format)           products#destroy

如果我已经做了资源,那么这不应该起作用吗:产品!?

3 个答案:

答案 0 :(得分:3)

这里有几个问题。首先,您的@photo对象未保存,这导致您的视图为成功保存的@product呈现new操作(因此使用put方法生成表单,因为对象为{{1 }})。可能是因为您在保存之后而不是之前设置了照片的product_id

persisted?

尝试在保存之前添加id,看看两个对象是否都有效。

如果其中一个对象无法保存,您仍会遇到一些逻辑问题,即重定向到 if @product.save && @photo.save @photo.product_id = @product.id 。而不是这样做,检查两个对象是否有效,然后保存,如果是,或者重定向,如果不是!然后,当重定向到new时,该对象尚未保存,并且该表单将被创建为正确的new表单:

post

最后,将对象的错误消息添加到新页面,以便您可以判断什么是无效的。

def create
  @product = current_user.products.build(params[:product])
  @photo = current_user.photos.new(params[:photo])
  @photo.product_id = @product.id 

  if @product.valid? && @photo.valid?
    @product.save
    @photo.save
    render "show", :notice => "Sale created!"
  else
    render "new", :notice => "Something went wrong!" # the product object hasn't been saved, this is now the correct form type
  end
end

答案 1 :(得分:0)

您的产品控制器不包含编辑和更新方法。 PUT用于更新。

答案 2 :(得分:-1)

检查您的路线(佣金路线)可能您的投放路线不正确,您不在控制器中创建:

def destroy 

end