3

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

路由错误

No route matches [PUT] "/products"

路线.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

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

4

3 回答 3

3

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

  if @product.save && @photo.save
    @photo.product_id = @product.id

尝试在保存之前添加 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

最后,将对象的错误消息添加到您的新页面,这样您就可以知道什么是无效的。

<% if @product.errors.any? %>
  <%= pluralize(@product.errors.count, "error") %> prohibited this product from being saved:

  <ul>
    <% @product.errors.full_messages.each do |error_message| %>
      <li><%= error_message %></li>
    <% end %>
  </ul>
<% end %>
于 2013-06-04T10:16:24.097 回答
0

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

于 2013-06-04T09:35:00.123 回答
-1

检查您的路线(耙路线),也许您的放置路线不正确,并且您没有在控制器中创建:

def destroy 

end 
于 2013-06-04T10:00:49.073 回答