nil:NilClass的未定义方法“上载”是什么意思?加载

时间:2018-07-16 00:23:56

标签: ruby-on-rails ruby

尝试将ActiveStorage用于简单的图像上传表单。它创建成功,但是在提交时会引发错误:

undefined method `upload' for nil:NilClass Did you mean? load

这是我要看的块:

    @comment = Comment.create! params.require(:comment).permit(:content)
    @comment.image.attach(params[:comment][:image])
    redirect_to comments_path 
  end

这在完整的控制器中:

class CommentsController < ApplicationController

  def new
    @comment = Comment.new
  end

  def create
    @comment = Comment.create! params.require(:comment).permit(:content)
    @comment.image.attach(params[:comment][:image])
    redirect_to comments_path 
  end

  def show
    @comment = Comment.find(params[:id])
  end
end

实际应该发生的是,您将带您到该页面以查看上载。在这里:

# new.html.erb

   <%= form_with model: @comment, local: true  do |form| %>
   <%= form.text_area :content %><br><br>
    <%= form.file_field :image %><br>
   <%= form.submit %>
  <% end %>

 # show.html.erb
   <%= image_tag @comment.image %>

这是comment.rb

class Comment < ApplicationRecord
  has_one_attached :image
end

日志中的错误:

 app/controllers/comments_controller.rb:12:in `create'
 Started POST "/comments" for 127.0.0.1 at 2018-07-15 21:30:23 -0400
 Processing by CommentsController#create as HTML
  Parameters: {"utf8"=>"✓",             "authenticity_token"=>"Al2SdLm1r6RWXQ6SrKNdUTWscSJ4/ha3h8C3xl6GvUsDhBGHkiesvGgyjL         5E1B1eyRUrYyjovFTQaGKwAZ1wtw==", "comment"=>{"content"=>"fdfdfdsdf", "image"=>#       <ActionDispatch::Http::UploadedFile:0xb3d36d8 @tempfile=#<Tempfile:C:/Users/tduke     /AppData/Local/Temp/RackMultipart20180715-3328-10frg81.png>,       @original_filename="9c6f46a506b9ddcb318f3f9ba34bcb27.png",       @content_type="image/png", @headers="Content-Disposition: form-data;    name=\"comment[image]\"; filename=\"9c6f46a506b9ddcb318f3f9ba34bcb27.png     \"\r\nContent-Type: image/png\r\n">}, "commit"=>"Create Comment"}
 Completed 500 Internal Server Error in 468ms (ActiveRecord: 4.0ms)

 NoMethodError (undefined method `upload' for nil:NilClass

你是说吗?加载):

4 个答案:

答案 0 :(得分:25)

如果有人遇到相同的问题,我只是通过确保在我的环境文件中设置了活动存储配置来解决了这个问题。

因此在development.rb中,确保该行 config.active_storage.service = :local 存在。

答案 1 :(得分:1)

尝试一下:

@comment = Comment.new(params.require(:comment).permit(:content, :image))
@comment.save!
redirect_to comments_path 

ActiveRecord非常聪明,可以知道image是由ActiveStorage处理的文件,因此您无需手动附加它。我猜是因为记录已经保存并且图像不存在,所以很适合。

此外,您还应该将强大的参数移至方法上。

def comment_params
  params.require(:comment).permit(:content, :image)
end 

并使用类似

@comment = Comment.new(comment_params)
@comment.save!
redirect_to comments_path

答案 2 :(得分:0)

如果您从5.1升级到5.2,则可能需要先运行rails app:update进行备份,因为这将要求您覆盖一些您可能想要保留的文件,例如config / routes.rb。

我遇到了这个问题,这已经为我解决了。

答案 3 :(得分:0)

就我而言,该错误仅出现在测试环境中。

由于某种原因,我的test.rb中缺少Active Storage配置,因此我添加了

config.active_storage.service = :test