我对Rails很陌生,我似乎无法想出这个。我有一个称为项目的基本CRUD,人们可以在这里提交新项目。我也这样做,所以如果他们选择这样做,他们可以上传文件。现在文件上传完全正常,但问题是如果用户没有上传文件我收到此错误。 undefined method 'original_filename' for nil:NilClass
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
现在我有点难过,因为我不需要original_filename
吗?它在添加文件时有效,但是当没有文件时它不会...
projects_controller.rb
class ProjectsController < ApplicationController
def index
@projects = Project.all
end
def show
end
def new
@projects = Project.new
end
def create #no view
@projects = Project.new(project_params)
uploaded_io = params[:doc]
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
if @projects.save
redirect_to projects_path, :notice => "Your project was sent!"
else
render "new"
end
end
def edit
@projects = Project.find(params[:id])
end
def update #no view
@projects = Project.find(params[:id])
if @projects.update_attributes(project_params)
redirect_to projects_path, :notice => "Your project has been updated."
else
render "edit"
end
end
def destroy #no view
@projects = Project.find(params[:id])
@projects.destroy
redirect_to projects_path, :notice => "Your project has been deleted."
end
private
def project_params
params.require(:project).permit(:title, :description)
end
end
(项目)_form.html.erb
<%= form_for(@projects, :html => { :multipart => true}) do |f| %>
<div class="container">
<div class="form-group">
<%= f.label :title %>
<%= f.text_field :title, class: "form-control" %>
</div>
<div class="form-group">
<%= f.label :description %>
<%= f.text_area :description, class: "form-control" %>
</div>
<%= label_tag :doc, 'Files (optional)' %>
<%= file_field_tag :doc %>
<br>
<div class="form-group">
<%= f.submit "Submit Project", class: "btn btn-primary" %>
</div>
<% end %>
然后我还在uploads
文件夹中设置了public
文件夹。
答案 0 :(得分:0)
只需进行以下更改:
def create #no view
@projects = Project.new(project_params)
uploaded_io = params[:doc]
if uploaded_io.present?
File.open(Rails.root.join('public', 'uploads', uploaded_io.original_filename), 'wb') do |file|
file.write(uploaded_io.read)
end
end
if @projects.save
redirect_to projects_path, :notice => "Your project was sent!"
else
render "new"
end
end
这将检查文档是否存在然后它只会尝试打开它,否则它会跳过它而你不会得到错误。如果没有文档,则params[:doc]
的值为nil
。因此rails尝试执行nil.original_filename
会导致错误。