2017-08-24 21 views
0

最近、私のプロジェクトを最新のRailsバージョン(5.2)にアップグレードしてActiveStorageを取得しました - AWS S3、Google Cloudなどのクラウドサービスへの添付ファイルアップロードを扱うライブラリActiveStorage(Rails 5.2)の添付ファイルを更新する方法

ほとんどすべて正常に動作します。私がアップロードし

user.avatar.attach(params[:file]) 

で画像を添付して

user.avatar.service_url 

でそれを受け取るしかし、今、私は/交換するユーザのアバターを更新することができます。私は走れると思った。

user.avatar.attach(params[:file]) 

もう一度。しかし、これはエラーを投げます:

ActiveRecord::RecordNotSaved: Failed to remove the existing associated avatar_attachment. The record failed to save after its foreign key was set to nil. 

これは何を意味するのですか?ユーザーのアバターを変更するにはどうすればよいですか? has_one_attachedを使用した場合

答えて

1

エラー

このエラーの原因は、あなたのモデルと添付ファイルレコード間has_one協会によって提起されています。これは、元の添付ファイルを新しい添付ファイルと置き換えようとすると元のファイルが孤立し、belongs_to関連の外部キー制約に失敗するために発生します。これはすべてのActiveRecord has_oneの関係(ActiveStorage固有のものではない)の動作です。新しいプロファイルを作成しようとして

類似例

class User < ActiveRecord::Base 
    has_one :profile 
end 
class Profile < ActiveRecord::Base 
    belongs_to :user 
end 

# create a new user record 
user = User.create! 

# create a new associated profile record (has_one) 
original_profile = user.create_profile! 

# attempt to replace the original profile with a new one 
user.create_profile! 
=> ActiveRecord::RecordNotSaved: Failed to remove the existing associated profile. The record failed to save after its foreign key was set to nil. 

、ActiveRecordのはbelongs_toレコードの外部キー制約を失敗し、nilに元のプロファイルのuser_idを設定しようとします。 ActiveStorageを使ってモデルに新しいファイルを添付しようとすると、元の添付ファイルの外部キーを無効にしようとすると、これは本質的に起こっていると思います。

ソリューション

has_one関係のためのソリューションは、(すなわち、別のものを添付しようとする前に、添付ファイルをパージする)新しいものを作成しようとする前に、関連するレコードを破壊することです。

user.avatar.purge # or user.avatar.purge_later 
user.avatar.attach(params[:file]) 

この動作は望ましいですか?

has_one関係に新しいレコードを添付しようとすると、ActiveStorageが元のレコードを自動的にパージするかどうかは、コアチームにとって最良の問題です。

IMOは他のすべてのhas_one関係と一貫して動作することが理にかなっており、自動的に行うのではなく新しいレコードを追加する前に元のレコードをパージすることを明示することが望ましい少し予期せぬ)。

資源:

+0

を見てみましょう役立つことを願っています詳細な回答をいただき、ありがとうございます。 – zarathustra

+1

この同日のこのコミットは、この問題を解決します。https://github.com/rails/rails/commit/656ee8b2dd1b06541f03ea19302d3529085f5139#diff-220c5602a1721b74f7ee61a8e09699da – ybart

0

私は画像の節約と同じ問題を抱えています。私はこれが

class User < ApplicationRecord 
    has_one_attached :avatar 
end 

は、フォームとコントローラ

= simple_form_for(@user) do |f| 
    = f.error_notification 
    .form-inputs 
    = f.input :name 
    = f.input :email 
    = f.input :avatar, as: :file 

    .form-actions 
    = f.button :submit 

コントローラ/ posts_controller.rb

def create 
    @user = User.new(post_params) 
    @user.avatar.attach(params[:post][:avatar]) 
    respond_to do |format| 
     if @user.save 
     format.html { redirect_to @user, notice: 'Post was successfully created.' } 
     format.json { render :show, status: :created, location: @user } 
     else 
     format.html { render :new } 
     format.json { render json: @user.errors, status: :unprocessable_entity } 
     end 
    end 
    end 
関連する問題