Ruby on Rails - Activeadmin - 使用虚拟属性更新模型

时间:2017-04-17 16:07:23

标签: ruby-on-rails ruby forms activeadmin

我有一个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链接,而不是为视频模型调用。但是创建很好。

1 个答案:

答案 0 :(得分:1)

让我试着改写一下这个问题:

  1. 您有一个模型Video
  2. Video具有虚拟属性my_link
  3. Video有一个before_update回调before_add_to_galerie
  4. 您希望在仅my_link更改
  5. 时触发此回调

    这看起来是否正确? 如果是这样,您有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