导轨4与你管

我想在你的rails 4 app中加入你的管。

我希望用户能够上传video文件,然后将其发布到我的管频道上。

我正在使用Rails 4和Youtube_it gem。 我一直在尝试按照本教程: http : //www.sitepoint.com/youtube-rails/

我的文件结构有项目模型和video模型。 协会是:

Project.rb

has_one :video accepts_nested_attributes_for :video 

Video.rb

  belongs_to :project 

我的video表有一个名为:include_video的布尔属性。

   'fixradio'}, {:class => "radio-inline create-project response-project"} %> 

如果这是真的,那么我想揭示用户添加video链接的字段(属性称为:链接)。

   

我提出这些问题的video表格是部分的。 部分是在项目表格内,还有其他问题。 我还有一个局部视图,其中包含用于管夹的容器(如教程中所示)。

视图部分包含在我的项目显示页面中:

    

我的问题是,当我尝试这种方法时,我收到的错误是:

 undefined method `include_video?' for nil:NilClass 

我不明白未定义的方法在我的video表中的属性名称的上下文中意味着什么,我也不明白nil:NilClass的含义。

我还尝试将video视图部分包含在内:

    

这不会给出错误消息,但它也不显示剪辑(当我在代码检查器中检查元素时,它根本没有显示。我可以看到上传也没有保存到数据库,因为我的控制台搜索说没有video。

我的项目控制器在我的video表中有白色标记属性(我的video控制器也是如此)。

  def project_params params.require(:project).permit( video_attributes: [:include_video, :link], def video_params params[:video].permit(:include_video, :link, :project_id) end 

如何解决这个问题呢?

我的video.rb有:

 class Video  do uid = link.match(YT_LINK_FORMAT) self.uid = uid[2] if uid && uid[2] if self.uid.to_s.length != 11 self.errors.add(:link, 'is invalid.') false elsif Video.where(uid: self.uid).any? self.errors.add(:link, 'is not unique.') false else get_additional_info end end # --------------- instance methods # --------------- private methods def get_additional_info begin client = YouTubeIt::OAuth2Client.new(dev_key: ENV['YT_developer_key']) video = client.video_by(uid) self.title = video.title self.duration = parse_duration(video.duration) self.author = video.author.name self.likes = video.rating.likes rescue self.title = '' ; self.duration = '00:00:00' ; self.author = '' ; self.likes = 0 ; self.dislikes = 0 end end def parse_duration(d) hr = (d / 3600).floor min = ((d - (hr * 3600)) / 60).floor sec = (d - (hr * 3600) - (min * 60)).floor hr = '0' + hr.to_s if hr.to_i < 10 min = '0' + min.to_s if min.to_i < 10 sec = '0' + sec.to_s if sec.to_i < 10 hr.to_s + ':' + min.to_s + ':' + sec.to_s end end 

我的project_controller有:

 def new @project = Project.new @project.video = Video.new end 

我的video_controller有:

  def show respond_with(@video) end def create @video = Video.new(video_params) @video.project_id = video_params[:project_id] end 

出现此错误:“undefined method include_video?' for nil:NilClass" include_video?' for nil:NilClass" – 它告诉你你正在调用include_video? nil 。 这反过来告诉您@project.video值为nil,此错误发生时。 所以,这就是发生的事情。

下一个要解决的问题是“为什么@ project.video评估为nil?”。 您的节目页面模板在Project控制器的show动作的上下文中运行。 此操作是否为@ project.video设置了值?

您可以在页面中执行的操作是:

<%= @project.video ||= Video.new %>

如果它已经存在,这将保持不变,但如果它不存在,它将定义它。 ||=是“等于自身或”的简写,所以上面的内容相当于:

<%= @project.video = @project.video || Video.new %>