Ruby on rails RubyonRails-Activeadmin-updatemodel和virtual属性
我有一个允许添加youtube URL的activeadmin表单。我在视频模型中验证此URL。当我想添加一个新视频时,它可以很好地工作,但当我编辑视频时,它什么也不做。Ruby on rails RubyonRails-Activeadmin-updatemodel和virtual属性,ruby-on-rails,ruby,forms,activeadmin,Ruby On Rails,Ruby,Forms,Activeadmin,我有一个允许添加youtube URL的activeadmin表单。我在视频模型中验证此URL。当我想添加一个新视频时,它可以很好地工作,但当我编辑视频时,它什么也不做。 app/admin/video.rb: ActiveAdmin.register Media, as: 'Videos' do form do |f| f.inputs "Add youtube video" do f.input :category f.sem
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
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
型号/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
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
class-Video
看起来好像永远不会触发before_update方法。我怎样才能使我的编辑工作
编辑:我发现它调用的是媒体模型的“更新前”链接,而不是视频模型的链接。但是创建很好。让我尝试重新表述这个问题:
视频
Video
具有虚拟属性my\u link
Video
在更新之前有一个回调
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
class-Video
或者您可以使用为什么您认为它没有被触发?您是否尝试过更新现有记录?我只是尝试在before_update中调用另一个方法,该方法只在控制台中打印一些文本,而不打印任何内容。当我不使用虚拟属性时,该方法确实有效,但我确实需要它来验证链接