Ruby on rails Rails,在访问或创建另一个实例时创建对象
我是Rails的新手,我将第一次处理这种情况 我有一个ActiveRecord课程,视频Ruby on rails Rails,在访问或创建另一个实例时创建对象,ruby-on-rails,ruby,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_r
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
当我从表格中创建新视频时,模型会将视频缩略图和视频嵌入代码添加到视频表中,稍后我将在视图中使用这些代码
我不喜欢这个意大利面代码,我想使用一个名为“video_info”的gem,它提供了获取嵌入代码、缩略图和所有内容的方法
我添加了一个方法:
def create_video_object
video_object = VideoInfo.new(url)
end
video\u object
包含了我需要的所有方法,因此我可以删除上面难看的方法。
我的问题是:如何在每次访问
video.rb
的实例时创建一个video\u对象?没有必要在每次创建视频时创建这样的对象,因为VideoInfo
不会持久保存到数据库中
最简单的方法是在Video
模型中添加一个info
方法,该方法初始化并返回VideoInfo
的实例:
def info
VideoInfo.new(url)
end
然后像这样使用该方法:
@video = Video.new(url: 'https://www.youtube.com/watch?v=DLzxrzFCyOs')
@video.info.provider
#=> 'YouTube'
无需在每次创建视频时创建这样的对象,因为
VideoInfo
不会持久保存到数据库中
最简单的方法是在Video
模型中添加一个info
方法,该方法初始化并返回VideoInfo
的实例:
def info
VideoInfo.new(url)
end
然后像这样使用该方法:
@video = Video.new(url: 'https://www.youtube.com/watch?v=DLzxrzFCyOs')
@video.info.provider
#=> 'YouTube'