1

我想将 youtube URL 的 youtube 嵌入链接版本存储在我的数据库中。我有一个助手可以帮助将用户粘贴的链接转换为嵌入版本。

无论如何,在保存之前,我想对其进行转换,然后将转换后的值传递给模型以进行保存。我在控制器中创建了一个方法,用于将链接参数传递给进行转换的辅助方法。

无论如何,这没有任何影响。粘贴到文本框中的原始链接将被保存。我已经尝试在模型中使用 before_save 和 self.link 执行此操作,但它也不起作用。以下是我当前的代码。

形式:

= form_for @micropost, :remote => true do |f|
  = f.text_field :link, :class => "addLinkField"
  = f.submit

转换粘贴链接的助手:

module OgpObjectsHelper
  def video_embed(video_url)
    if video_url[/(https?):\/\/(www.)?(youtube\.com\/watch\?v=|youtu\.be\|youtube\.com\/watch\?feature=player_embedded&v=)([A-Za-z0-9_-]*)(\&\S+)?(\S)*/]youtube_id = $4
      "http://www.youtube.com/embed/#{ youtube_id }"
  end
end

控制器:

class MicropostsController < ApplicationController
  include OgpObjectsHelper

  before_filter :convert_video_link

  def create
    @micropost = current_user.microposts.build(params[:micropost])
        respond_to do |format|
            if @micropost.save
              format.html { render :partial => '/users/partials/micropost'} 
            end
        end
  end

  def convert_video_link
    video_embed(params[:micropost][:link])
  end

end

我将不胜感激最好的方法解决方案谢谢。

亲切的问候

4

3 回答 3

1

在上面的代码中,您需要将convert_video_link方法修改为:

params[:micropost][:link] = video_embed(params[:micropost][:link])

由于您仍在从param值创建记录。现有的方法不会改变这些参数。

于 2012-05-28T13:55:37.103 回答
1

将其放入您的 Micropost 模型中,如果与 youtube 格式不匹配,请不要忘记验证 cos,链接现在将为 nil

# micropost.rb 
include OgpObjectsHelper

before_validate :convert_video_link

protected 
def convert_video_link
  self.link = video_embed(link)
end
于 2012-05-28T13:58:46.623 回答
1

问题在于你的助手。您正在尝试将link属性设置为正则表达式中的第四个反向引用,但实际上并未分配该值。过滤器只返回一个链接,但没有将模型上的任何属性设置为该链接。我的建议是将其移至模型的 before_save 中。以下未经测试的代码应该可以做到。

class Micropost

before_save :convert_video_url

def convert_video_url
  url = self.link
  youtube_id = url.scan(/(https?):\/\/(www.)?(youtube\.com\/watch\?v=|youtu\.be\|youtube\.com\/watch\?feature=player_embedded&v=)([A-Za-z0-9_-]*)(\&\S+)?(\S)*/)[0][3]
  self.link = "http://www.youtube.com/embed/#{ youtube_id }"
end

请注意,如果 YouTube 更改其 URL 的格式,正则表达式将中断。

罗宾

于 2012-05-28T14:06:17.090 回答