Rails,在访问或创建另一个实例时创建一个对象

时间:2016-02-07 13:07:25

标签: ruby-on-rails ruby

我是Rails的新手,我是第一次处理这种情况。

我有一个ActiveRecord课程,视频。

class Video < ActiveRecord::Base

  def generate_html_for_content
    raw_embed
  end

  private

  def save_image
    self.remote_screenshot_url = extract_thumb if screenshot.blank?
  end

  def save_raw_embed
    self.raw_embed = create_embed
  end

  def extract_thumb
    if is_youtube_video?
      youtube_image
    else
      'http://placehold.it/160x90'
    end
  end

  def create_embed
    youtube_embed if is_youtube_video?
  end

  def is_youtube_video?
    # https://www.youtube.com/watch?v=lmc21V-zBq0
    url.include? 'youtu'
  end

  def youtube_id
    url.match(/^(?:https?:\/\/)?(?:www\.)?youtu(?:\.be|be\.com)\/(?:watch\?v=)?([\w-]{10,})/)[1]
  end

  def youtube_embed
    "<div class=\"embeddedContent\"><iframe id=\"ytplayer\" type=\"text/html\" width=\"1080\" height=\"607.5\" src=\"https://www.youtube.com/embed/#{youtube_id}?autohide=1?rel=0&color=white\" frameborder=\"0\" allowfullscreen></iframe></div>"
  end

  def youtube_image
    "http://img.youtube.com/vi/#{youtube_id}/0.jpg"
  end
end

我还有两个回调

before_save :save_image
before_save :save_raw_embed

当我从表单中创建新视频时,模型会在视频表格中添加视频缩略图和视频嵌入代码,稍后我将在视图中使用。

我不喜欢这种意大利面条代码,我想使用名为&#34; video_info&#34;这给了我嵌入代码,缩略图和一切的方法。

我添加了一个方法:

def create_video_object
  video_object = VideoInfo.new(url)
end

video_object拥有我需要的所有方法,因此我可以删除上面的丑陋方法。 我的问题是:每次访问Video.rb的实例时,如何创建video_object?

1 个答案:

答案 0 :(得分:2)

每次创建视频时都不需要创建这样的对象,因为VideoInfo不会持久存储到数据库中。

最简单的方法是在info模型中添加Video方法,初始化并返回VideoInfo的实例:

def info
  VideoInfo.new(url)
end

然后使用这样的方法:

@video = Video.new(url: 'https://www.youtube.com/watch?v=DLzxrzFCyOs')
@video.info.provider
#=> 'YouTube'