Rails:当我上传文件时,我收到一个奇怪的“NoMethodError”

时间:2015-02-06 16:43:02

标签: ruby-on-rails ruby ruby-on-rails-3 upload

我对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文件夹。

1 个答案:

答案 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会导致错误。