Ошибка nometoderror активного хранилища Rails 6 (неопределенное имя метода для nil: NilClass)

#ruby-on-rails #ruby-on-rails-6 #production #rails-activestorage

#ruby-on-rails #ruby-on-rails-6 #производство #rails-activestorage

Вопрос:

У меня возникает проблема при попытке прикрепить изображение с помощью активного хранилища, которое было передано в режиме разработки, но сбой в рабочем режиме.

Подробности, как показано ниже:

Модель:

 class Post < ApplicationRecord
    extend FriendlyId
    friendly_id :title, use: :slugged
    
    validates :title, presence: true
    
    has_many :post_comments, dependent: :destroy

    has_one_attached :wall_picture
    
    # validates :content_rich_text, presence: true
    has_rich_text :content_rich_text
    
    def self.approved
      where(approved: :true)
    end
end
 

Контроллер:

 def create
        @post = Post.new(post_param)
        @post.save!
        redirect_to posts_path
   end
private
    # define param for each post
    def post_param
        params.require(:post).permit(:id, :wall_picture, :title, :content_rich_text)
    end
 

Конфигурация хранилища:

 google:
    service: GCS
    project: pet-app
    credentials: <%= Rails.root.join("config/pet-app-google-storage-key.json") %>
    bucket: pet-app
 

Войдите в систему разработки (создание объекта успешно):

 Processing by PostsController#create as HTML
  Parameters: {"authenticity_token"=>"IssIp0Mhh90gl9pwuuDfMdrCYz5Rf6gxMlv/WbTe6dAWye25eWAMjfhp135CqGlZj6bCYgvslQHX75yoyn/Sqw==", "post"=>{"wall_picture"=>#<ActionDispatch::Http::UploadedFile:0x00007f05559da830 @tempfile=#<Tempfile:/tmp/RackMultipart20210328-169-j5mnl3.jpg>, @original_filename="cover_building.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name="post[wall_picture]"; filename="cover_building.jpg"rnContent-Type: image/jpegrn">, "title"=>"Test new post", "content_rich_text"=>""}, "commit"=>"Gửi nội dung"}
  TRANSACTION (0.2ms)  BEGIN
   app/controllers/posts_controller.rb:13:in `create'
  Post Exists? (0.8ms)  SELECT 1 AS one FROM "posts" WHERE "posts"."id" IS NOT NULL AND "posts"."slug" = $1 LIMIT $2  [["slug", "test-new-post"], ["LIMIT", 1]]
   app/controllers/posts_controller.rb:13:in `create'
  Post Create (3.7ms)  INSERT INTO "posts" ("title", "created_at", "updated_at", "slug") VALUES ($1, $2, $3, $4) RETURNING "id"  [["title", "Test new post"], ["created_at", "2021-03-28 09:57:04.803702"], ["updated_at", "2021-03-28 09:57:04.803702"], ["slug", "test-new-post"]]
 

Войдите в рабочую среду (я использую Digital Ocean Droplet с Ubuntu 20.04)

 Processing by PostsController#create as HTML
  Parameters: {"authenticity_token"=>"d1OTNiyXbvamUEUUUfc9hL1x1Biyh/bJf8NFz99HkTnXNIohTUsn4alNeimiR4o/syG7/NpKCvoSufbVaCp/ A==", "post"=>{"wall_picture"=>#<ActionDispatch::Http::UploadedFile:0x0000563231456050 @tempfile=#<Tempfile:/tmp/RackMultipart20210328-32996-ott8bf.jpg>, @original_filename="cover_building.jpg", @content_type="image/jpeg", @headers="Content-Disposition: form-data; name="post[wall_picture]"; filename="cover_building.jpg"rnContent-Type: image/jpegrn">, "title"=>"Test new post", "content_rich_text"=>""}, "commit"=>"Gửi nội dung"}
Completed 500 Internal Server Error in 4ms (ActiveRecord: 0.0ms | Allocations: 934)

**NoMethodError (undefined method `name' for nil:NilClass):**
 

app/controllers/posts_controller.rb:12: в `создать»

Может ли кто-нибудь помочь мне узнать, почему я получаю эту проблему в производстве и как ее решить? Большое вам спасибо!

Комментарии:

1. @post.save! вызовет ActiveRecord::RecordInvalid исключение, если есть какие-либо ошибки проверки. Хотя это может быть полезно для отладки или начальных файлов, неверный пользовательский ввод не является исключительным событием. Использовать if @post.save; redirect_to posts_path; else; render :new; end . Это также рассматривается практически в любом базовом руководстве по rails. guides.rubyonrails.org /…

2. Я также использую post.save вместо post.save! в этом случае, но проблема возникает снова. Я думаю, что причина может быть связана с ruby 3.0.0 в rails 6.1.3. Известен ли вам другой способ сохранения изображения модели post? большое спасибо.

3. Вы действительно проверяли возвращаемое значение и отвечали соответствующим образом?

Ответ №1:

Не забудьте также настроить свой сервис config/environments/production.rb .

 # Store files locally.
config.active_storage.service = :local
 

:local или любой другой сервис, который вы решите использовать в производстве

https://edgeguides.rubyonrails.org/active_storage_overview.html#disk-service