Rails "TypeError (no clin nil to String)" 使用 image_tag、activeStorage 和 "has_many_attached" 加载图像时



我正在尝试按照本教程为我的模型上传多张图像: https://www.youtube.com/watch?v=A23zCePXe74

使用 activeStorage 将图像上传和保存到数据库中似乎有效,但是当我转到显示页面时,图像不会呈现。我尝试在一个新的 rails 应用程序中执行这些步骤,然后显示图像,但是当我尝试在现有 rails 应用程序中执行这些步骤时,我在服务器控制台中看到 TypeError 和内部服务器错误,并且页面加载时没有图像。

任何帮助或建议将不胜感激。

我的模型看起来像

class Post < ApplicationRecord
has_many_attached :images
end

我的控制器如下所示:

class PostsController < ApplicationController
before_action :set_post, only: [:show, :edit, :update, :destroy]
config.relative_url_root = ""
# GET /posts
# GET /posts.json
def index
@posts = Post.all
end
# GET /posts/1
# GET /posts/1.json
def show
end
# GET /posts/new
def new
@post = Post.new
end
# GET /posts/1/edit
def edit
end
# POST /posts
# POST /posts.json
def create
@post = Post.new(post_params)
respond_to do |format|
if @post.save
format.html { redirect_to @post, notice: 'Post was successfully created.' }
format.json { render :show, status: :created, location: @post }
else
format.html { render :new }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# PATCH/PUT /posts/1
# PATCH/PUT /posts/1.json
def update
respond_to do |format|
if @post.update(post_params)
format.html { redirect_to @post, notice: 'Post was successfully updated.' }
format.json { render :show, status: :ok, location: @post }
else
format.html { render :edit }
format.json { render json: @post.errors, status: :unprocessable_entity }
end
end
end
# DELETE /posts/1
# DELETE /posts/1.json
def destroy
@post.destroy
respond_to do |format|
format.html { redirect_to posts_url, notice: 'Post was successfully destroyed.' }
format.json { head :no_content }
end
end
private
# Use callbacks to share common setup or constraints between actions.
def set_post
@post = Post.find(params[:id])
end
# Never trust parameters from the scary internet, only allow the white list through.
def post_params
params.require(:post).permit(:title, :body, images: [])
end
end

我的 _form.html.erb 看起来像:

<%= form_with(model: post, local: true) do |form| %>
<% if post.errors.any? %>
<div id="error_explanation">
<h2><%= pluralize(post.errors.count, "error") %> prohibited this post from being saved:</h2>
<ul>
<% post.errors.full_messages.each do |message| %>
<li><%= message %></li>
<% end %>
</ul>
</div>
<% end %>
<div class="field">
<%= form.label :title %>
<%= form.text_field :title %>
</div>
<div class="field">
<%= form.label :body %>
<%= form.text_area :body %>
</div>
<div class="field">
<%= form.label :images %>
<%= form.file_field :images, multiple: true %>
</div>
<div class="actions">
<%= form.submit %>
</div>
<% end %>

我的节目.html.erb看起来像:

<p id="notice"><%= notice %></p>
<p>
<strong>Title:</strong>
<%= @post.title %>
</p>
<p>
<strong>Body:</strong>
<%= @post.body %>
</p>
<% (0...@post.images.count).each do |image| %>
<%= image_tag(@post.images[image]) %>
<% end %>
<%= link_to 'Edit', edit_post_path(@post) %> |
<%= link_to 'Back', posts_path %>

我的宝石文件如下所示:

source 'https://rubygems.org'
git_source(:github) { |repo| "https://github.com/#{repo}.git" }
ruby '2.6.2'
# Bundle edge Rails instead: gem 'rails', github: 'rails/rails'
gem 'rails', '~> 6.0.0.rc2'
# Use postgresql as the database for Active Record
gem 'pg', '>= 0.18', '< 2.0'
# Use Puma as the app server
gem 'puma', '~> 3.11'
# Use SCSS for stylesheets
gem 'sass-rails', '~> 5'
# Transpile app-like JavaScript. Read more: https://github.com/rails/webpacker
gem 'webpacker', '~> 4.0'
# Turbolinks makes navigating your web application faster. Read more: https://github.com/turbolinks/turbolinks
gem 'turbolinks', '~> 5'
# Build JSON APIs with ease. Read more: https://github.com/rails/jbuilder
gem 'jbuilder', '~> 2.7'
# Use Redis adapter to run Action Cable in production
# gem 'redis', '~> 4.0'
# Use Active Model has_secure_password
# gem 'bcrypt', '~> 3.1.7'
# Use Active Storage variant
# gem 'image_processing', '~> 1.2'
# Reduces boot times through caching; required in config/boot.rb
gem 'bootsnap', '>= 1.4.2', require: false
group :development, :test do
# Call 'byebug' anywhere in the code to stop execution and get a debugger console
gem 'byebug', platforms: [:mri, :mingw, :x64_mingw]
end
group :development do
# Access an interactive console on exception pages or by calling 'console' anywhere in the code.
gem 'web-console', '>= 3.3.0'
gem 'listen', '>= 3.0.5', '< 3.2'
# Spring speeds up development by keeping your application running in the background. Read more: https://github.com/rails/spring
gem 'spring'
gem 'spring-watcher-listen', '~> 2.0.0'
end
group :test do
# Adds support for Capybara system testing and selenium driver
gem 'capybara', '>= 2.15'
gem 'selenium-webdriver'
# Easy installation and use of web drivers to run system tests with browsers
gem 'webdrivers'
end
# Windows does not include zoneinfo files, so bundle the tzinfo-data gem
gem 'tzinfo-data', platforms: [:mingw, :mswin, :x64_mingw, :jruby]
gem 'redis'
gem 'braintree'
gem 'bcrypt'
gem 'foreman'
gem 'rails-controller-testing'
gem 'faker'
gem 'pagy'
gem 'figaro'
gem 'gon'
gem 'modernizr-rails'
gem 'stripe-rails'
gem 'paperclip'
# thirdparty authentications
gem 'omniauth-google-oauth2'
gem 'omniauth-facebook'
gem 'omniauth-twitter'
gem 'activerecord-session_store'
# for front end
gem 'react-rails'
gem 'bootstrap'
gem 'sprockets-rails'
gem 'jquery-rails'
# catches test emails
gem 'mailcatcher'
gem 'devise'
# admin panel
gem 'rails_admin'
# active storage variant
gem 'mini_magick', '~> 4.8'

我在服务器控制台中看到的错误是:

Parameters: {"content_type"=>"image/jpeg", "disposition"=>"inline; filename="Capture.JPG"; filename*=UTF-8''Capture.JPG", "encoded_key"=>"eyJfcmFpbHMiOnsibWVzc2FnZSI6IkJBaDdDRG9JYTJWNVNTSWhaamM1YlRGNmFtdDNNM0p0ZFhwaE5UTnljekYxWW1kaWFIbHFaUVk2QmtWVU9oQmthWE53YjNOcGRHbHZia2tpUVdsdWJHbHVaVHNnWm1sc1pXNWhiV1U5SWtOaGNIUjFjbVV1U2xCSElqc2dabWxzWlc1aGJXVXFQVlZVUmkwNEp5ZERZWEIwZFhKbExrcFFSd1k3QmxRNkVXTnZiblJsYm5SZmRIbHdaVWtpRDJsdFlXZGxMMnB3WldjR093WlUiLCJleHAiOiIyMDIwLTAxLTExVDA0OjA2OjUwLjc2MFoiLCJwdXIiOiJibG9iX2tleSJ9fQ==--983c22b711b8ba21f15b0f7ce768a3165fe9810a", "filename"=>"Capture"}
TypeError (no implicit conversion of nil into String):
rack (2.1.0) lib/rack/files.rb:25:in `expand_path'
rack (2.1.0) lib/rack/files.rb:25:in `initialize'
activestorage (6.0.2.1) app/controllers/active_storage/disk_controller.rb:45:in `new'
activestorage (6.0.2.1) app/controllers/active_storage/disk_controller.rb:45:in `serve_file'
activestorage (6.0.2.1) app/controllers/active_storage/disk_controller.rb:12:in `show'
actionpack (6.0.2.1) lib/action_controller/metal/basic_implicit_render.rb:6:in `send_action'
actionpack (6.0.2.1) lib/abstract_controller/base.rb:196:in `process_action'
actionpack (6.0.2.1) lib/action_controller/metal/rendering.rb:30:in `process_action'
actionpack (6.0.2.1) lib/abstract_controller/callbacks.rb:42:in `block in process_action'
.
.
.
puma (3.12.2) lib/puma/configuration.rb:227:in `call'
puma (3.12.2) lib/puma/server.rb:674:in `handle_request'
puma (3.12.2) lib/puma/server.rb:476:in `process_client'
puma (3.12.2) lib/puma/server.rb:334:in `block in run'
puma (3.12.2) lib/puma/thread_pool.rb:135:in `block in spawn_thread'
Completed 500 Internal Server Error in 1ms (ActiveRecord: 0.0ms | Allocations: 623)

每当我运行"rails db"时,我看到的另一件奇怪的事情是:

Rack::File is deprecated, please use Rack::Files instead.
psql (12.1 (Ubuntu 12.1-1.pgdg18.04+1), server 11.5 (Ubuntu 11.5-1.pgdg18.04+1))
Type "help" for help.

我也偶然发现了这个。

TL;灾难恢复使用宝石文件中的gem 'rack', '~> 2.0.8'

似乎最新版本的机架在这里的根上使用expand_path:https://github.com/rack/rack/commit/8f85307711ca5e7a4729641fda1552890ffa129a#diff-894804c816a11584eb28499cb8bbe396R25

似乎 Rails 的 6.2.0.1 版本在这里使用了Rack::File.new(nil): https://github.com/rails/rails/commit/feab7031b57040afa2b2f5f78f9251dbad6cbdf8#diff-17640e7129bc730594120c1ac91d7928L45

在较新版本的Rails中(目前仅在Github中(,它不会中断,因为它已被更改。但在当前版本中,它确实会中断。

您目前可以使用gem 'rack', '~> 2.0.8'将机架降级到版本 2.0.8。

编辑:我在这里打开了一个关于机架的问题:https://github.com/rack/rack/issues/1471

我将我的"机架"gem更新到 2.2.2 以使用bundle update rack解决此问题。我发现此解决方案的方式是导航到@guillaume打开的问题,他们已经使用较新的"机架"版本纠正了该问题。

相关内容

  • 没有找到相关文章

最新更新