在我的Rails 5.2.2应用程序中,我正在使用Active Storage将logos
附加到profiles
:
class Profile < ApplicationRecord
has_many_attached :logos
end
如何在更新时将新徽标附加到个人资料上?
现在,我正在检查控制器中的logos
参数,该参数工作正常:
class ProfileController < ApplicationController
def update
if params[:profile][:logos].present?
@profile.logo_active = true # This is the important attribute I need to set
end
if @profile.update(profile_params)
flash[:success] = "Profile updated."
redirect_to profile_path
end
end
end
是否可以在模型中执行相同的操作,即检查附件是否确实是新附件,然后根据需要设置logo_active
属性?
我玩弄了Rails的new_record?
方法,但无济于事。
答案 0 :(得分:0)
您可以检查是否有附件
@profile.logos.attached?
https://api.rubyonrails.org/classes/ActiveStorage/Attached/Many.html#method-i-attached-3F
答案 1 :(得分:0)
我建议编写一个小型服务,该服务将为您更新个人资料并处理徽标更改。例如。像这样的东西:
# app/services/profile_updater.rb
class ProfileUpdater
def self.call(params)
profile = Profile.find(params.delete(:id))
logos_was = profile.logos
profile.assign_attributes(params)
profile.logo_active = profile.logos != logos_was
profile.save
end
end
如果您更喜欢回调而不是服务,则可以按照this question
中所述为ActiveStorage模型创建回调