我有一个activeadmin表单,允许添加youtube URL。我在视频模型中验证了此URL。当我想要添加新视频但在我编辑视频时什么也不做的时候,它确实很有用 app / admin / video.rb:
ActiveAdmin.register Media, as: 'Videos' do
form do |f|
f.inputs "Add youtube video" do
f.input :category
f.semantic_errors :error
f.has_many :videos, allow_destroy: true do |g|
g.input :mylink, :label => "Youtube link : ", :type => :text
end
actions
end
end
end
model / video.rb:
class Video < ApplicationRecord
belongs_to :media
attr_accessor :mylink
YT_LINK_FORMAT = /\A.*(youtu.be\/|v\/|u\/\w\/|embed\/|watch\?v=|\&v=)([^#\&\?]*).*\z/i
before_create :before_add_to_galerie
before_update :before_add_to_galerie
def before_add_to_galerie
uid = @mylink.match(YT_LINK_FORMAT)
self.uid = uid[2] if uid && uid[2]
if self.uid.to_s.length != 11
self.errors.add(:mylink, 'is invalid.')
throw :abort
false
elsif Video.where(uid: self.uid).any?
self.errors.add(:mylink, 'is not unique.')
throw :abort
false
end
end
validates :mylink, presence: true, format: YT_LINK_FORMAT
end
看起来永远不会触发before_update方法 如何进行编辑?
编辑:我发现它正在调用Media模型的before_update链接,而不是为视频模型调用。但是创建很好。
答案 0 :(得分:1)
让我试着改写一下这个问题:
Video
Video
具有虚拟属性my_link
Video
有一个before_update
回调before_add_to_galerie
my_link
更改这看起来是否正确?
如果是这样,您有2个选项,首先 - 如果您updated_at
将其与my_link
一起更改
class Video < ApplicationRecord
attr_reader :my_link
# ...
def my_link=(val)
return val if val == my_link
@my_link = val
self.updated_at = Time.zone.now
end
end
或者您可以使用ActiveModel