2017-04-17 74 views
1

我有一個activeadmin表單,允許添加一個youtube URL。我在我的視頻模型中驗證了此網址。當我想添加一個新視頻,但在編輯視頻時什麼也不做,它確實很好。
應用程序/管理/ video.rb:Ruby on Rails - Activeadmin - 具有虛擬屬性的更新模型

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 

模型/ 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方法不會被觸發。
如何使我的編輯工作?

編輯:我想,它是調用媒體模型before_update鏈接,而不是視頻one.But創建是好的。

+0

爲什麼你認爲它不觸發?您是否嘗試更新現有記錄? – Bohdan

+0

我只是試圖調用before_update中的另一種方法,只打印一些文本到控制檯,它不打印任何東西 – KingOfBabu

+0

它不工作,當我不使用虛擬屬性,但我真的需要這個來驗證鏈接 – KingOfBabu

回答

1

讓我嘗試重組問題:

  1. 你有一個模型Video
  2. Video有一個虛擬的屬性my_link
  3. Videobefore_update回調before_add_to_galerie
  4. 你想這個回調觸發當只有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