nil:NilClass 的未定义方法 `upload' 你的意思是?加载

Posted

技术标签:

【中文标题】nil:NilClass 的未定义方法 `upload\' 你的意思是?加载【英文标题】:undefined method `upload' for nil:NilClass Did you mean? loadnil:NilClass 的未定义方法 `upload' 你的意思是?加载 【发布时间】:2018-12-23 11:52:53 【问题描述】:

尝试将 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

你的意思是?加载):

【问题讨论】:

您在 `Comment.create!1 中有任何错误吗?将您的许可方法移动到私有方法是标准做法。 这发生在哪一行? @JoshBrody Line 9 在您的项目中对upload 进行全文搜索,并告诉我们它在哪里发生以及它在做什么——Image 模型中是否有一个upload 方法作为一个运行after_save 还是什么?您需要提供更多详细信息,我们才能解决您的问题 显示CommentImage模型类的全部内容 【参考方案1】:

我通过确保在我的环境文件中设置了我的 Active Storage 配置来解决它。

所以,在development.rb 中,确保该行

config.active_storage.service = :local

存在。

【讨论】:

我刚刚将旧 Rails 升级到 5.2 并发生错误。这个答案挽救了我的一天。谢谢! 非常感谢。有同样的问题。祝你找到答案。【参考方案2】:

试试这个:

@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 

并使用like,

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

【讨论】:

所以仍然会抛出错误:undefined method 'upload' for nil:NilClass Did you mean? load 尝试重启你的 Rails 服务器 是的,不幸的是,这也不起作用。我认为这是一种无效或未实施的方法。我将在日志中发现的错误添加到帖子中 如果你想把它拉下来,github.com/joshmn/tduke 我刚刚构建了它并确保它作为一个使用 ActiveStorage 的示例工作。你运行的是什么版本的 Rails?您是否安装了 ActiveStorage 的迁移?【参考方案3】:

如果你从 5.1 升级到 5.2,你可能需要运行

rails app:update

首先进行备份,因为这会要求您覆盖一些您可能想要保留的文件,例如 config/routes.rb

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

【讨论】:

【参考方案4】:

在我的情况下,错误只出现在测试环境中。

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

config.active_storage.service = :test

【讨论】:

【参考方案5】:

这些答案都不适合我。我通过更改storage.yml 文件使其工作,以便开发存储到"tmp/storage" 而不是"storage"。像这样:

test:
  service: Disk
  root: <%= Rails.root.join("storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

# Use rails credentials:edit to set the AWS secrets (as aws:access_key_id|secret_access_key)
amazon:
  service: S3
  access_key_id: <%= Rails.application.credentials.dig(:aws, :access_key_id) %>
  secret_access_key: <%= Rails.application.credentials.dig(:aws, :secret_access_key) %>
  region: <%= Rails.application.credentials.dig(:aws, :region) %>
  bucket: <%= Rails.application.credentials.dig(:aws, :bucket) %>

【讨论】:

以上是关于nil:NilClass 的未定义方法 `upload' 你的意思是?加载的主要内容,如果未能解决你的问题,请参考以下文章

nil:NilClass 的未定义方法 `upload' 你的意思是?加载

nil:NilClass 的未定义方法“每个”,但我使用了实例变量

CalendarPosts#index 中的 NoMethodError 用于 nil:NilClass 的未定义方法 'title'... 仅有时会出错?

Nokogiri:遇到错误“nil:NilClass 的未定义方法‘文本’”

搜索检查失败:nil:NilClass 的未定义方法“map”

Rspec 测试:NoMethodError - nil.Nilclass 的未定义方法“id”