Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails RubyonRails-Activeadmin-updatemodel和virtual属性_Ruby On Rails_Ruby_Forms_Activeadmin - Fatal编程技术网

Ruby on rails RubyonRails-Activeadmin-updatemodel和virtual属性

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

我有一个允许添加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.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中调用另一个方法,该方法只在控制台中打印一些文本,而不打印任何内容。当我不使用虚拟属性时,该方法确实有效,但我确实需要它来验证链接