我正在尝试制作一个允许用户创建销售的小应用。有一个用户模型产品型号和照片模型。用户有很多产品,产品有很多照片。但由于某些原因,在我尝试创建产品页面后,我收到了此错误。
路由错误
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
如果我已经做了资源,那么这不应该起作用吗:产品!?
答案 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