我正在尝试上传照片,但在按下上传按钮后,我收到此错误消息。我是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 %>
答案 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会做一些非常了不起的事情:
- 它需要一个ActiveRecord 对象并从中构建一个“路由”(来自模型)
- 使用ActiveRecord对象的数据填充表单
- 它允许您在表单上保留感知的持久状态(通过使数据永久化)
醇>
您遇到的问题是您正在向表单传递一个简单的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;获取数据。在屏幕上为您处理