匹配POST路由轨道4

时间:2014-07-24 02:39:59

标签: ruby-on-rails ruby rails-routing

我正在尝试上传照片,但在按下上传按钮后,我收到此错误消息。我是rails 4的新手,所以我不确定我错过了什么。

我的逻辑是点击提交按钮。这将导致create操作触发并创建IncomePicture对象并将其存储在我的数据库中。

No route matches [POST] "/income_pictures/new"

路线:

root_path                   GET      /                                   static_pages#home
income_pictures_path        GET      /income_pictures(.:format)          income_pictures#index
                            POST     /income_pictures(.:format)          income_pictures#create
new_income_picture_path     GET      /income_pictures/new(.:format)      income_pictures#new
edit_income_picture_path    GET      /income_pictures/:id/edit(.:format) income_pictures#edit
income_picture_path         GET      /income_pictures/:id(.:format)      income_pictures#show
                            PATCH    /income_pictures/:id(.:format)      income_pictures#update
                            PUT      /income_pictures/:id(.:format)      income_pictures#update
                            DELETE   /income_pictures/:id(.:format)      income_pictures#destroy

控制器:

class IncomePicturesController < ApplicationController
  def new
    @income_picture = IncomePicture.new
  end

  def create
    @income_picture = IncomePicture.new(IncomePicture_params)
    if @income_picture.save
      flash[:notice] = "Income picture successfully uploaded"
      redirect_to @income_picture
    end
  end

  def show
    @income_picture = IncomePicture.find(params[:id])
  end

  def index
    @income_picture = IncomePicture.all
  end

  private
    def IncomePicture_params
      params.require(:income_picture).permit(:image, :name)
    end
end

查看:

<%= form_for :income_picture, :html => { :multipart => true } do |f| %>
    <p>
        <%= f.label :name %>
        <%= f.text_field :name %>
    </p>
    <p>
        <%= f.label :image %>
        <%= f.file_field :image %>
    </p>
    <p><%= f.submit %></p>
<% end %>

2 个答案:

答案 0 :(得分:2)

我认为你想要form_for @income_picture而不是form_for :income_picture

the form guide:使用符号创建一个表格到new_income_picture_path,即/ income_picture / new,而使用填充的实例变量创建一个表格到income_pictures_path,即收入/图片。两者都将表单的方法设置为POST。但是,没有像POST到/ income_picture / new /这样的路由,这就是造成错误的原因。

答案 1 :(得分:1)

<强>的form_for

要详细说明接受的答案,你必须记住,在调用form_for时,Rails会做一些非常了不起的事情:

  
      
  1. 它需要一个ActiveRecord 对象并从中构建一个“路由”(来自模型)
  2.   
  3. 使用ActiveRecord对象的数据填充表单
  4.   
  5. 它允许您在表单上保留感知的持久状态(通过使数据永久化)
  6.   

您遇到的问题是您正在向表单传递一个简单的symbol - 这会阻止Rails准确访问使上述3“魔术”步骤成为可能所需的数据。

这意味着你会得到像你所看到的那样的随机错误(IE在没有ActiveRecord对象的情况下,Rails只会使用您在页面上使用的相同网址 - /new

-

<强> ActiveRecord的

解决问题的方法是将symbol替换为ActiveRecord object,这是在接受的答案中建议的。

使用ActiveRecord object@instance_variable)的原因在于Ruby的核心功能 - 它是一种面向对象的语言。面向对象,这意味着每次填充ActiveRecord对象时,基本上都会为Rails提供一系列其他信息,例如model_name等。

这意味着当您将@instance_variable传递给form_for方法时,Rails将能够从ActiveRecord&amp;获取数据。在屏幕上为您处理