diff --git a/app/models/audio.rb b/app/models/audio.rb index 1d1e1459..89dfa4b4 100644 --- a/app/models/audio.rb +++ b/app/models/audio.rb @@ -6,7 +6,12 @@ class Audio < ActiveRecord::Base belongs_to :user belongs_to :audioable, :polymorphic => true - validates_presence_of :url validates_format_of :url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?\.mp3/i, :message => "should look like a URL ending in .mp3" + after_validation :set_user + + def set_user + self.user = current_user unless self.user.present? + end + end diff --git a/app/models/content.rb b/app/models/content.rb index e7b13840..0feebaab 100644 --- a/app/models/content.rb +++ b/app/models/content.rb @@ -4,6 +4,7 @@ class Content < ActiveRecord::Base acts_as_taggable_on :tags, :sections acts_as_featured_item acts_as_moderatable + acts_as_media_item belongs_to :user belongs_to :article diff --git a/app/models/image.rb b/app/models/image.rb index d4d1b58f..5a3ca988 100644 --- a/app/models/image.rb +++ b/app/models/image.rb @@ -16,14 +16,19 @@ class Image < ActiveRecord::Base } before_validation :download_image, :if => :remote_image_url? - validates_presence_of :remote_image_url, :allow_blank => true, :message => 'invalid image or url.' + validates_presence_of :remote_image_url, :allow_blank => true, :message => 'invalid image or url.', :if => :remote_image_url? + validates_presence_of :image, :image_file_name, :image_content_type, :image_file_size - def url options = {} - self.image.url options - end + after_validation :set_user + + delegate :url, :to => :image private + def set_user + self.user = current_user unless self.user.present? + end + def download_image self.image = open(URI.parse(remote_image_url)) end diff --git a/app/models/video.rb b/app/models/video.rb index d48bf9a3..deb87c8e 100644 --- a/app/models/video.rb +++ b/app/models/video.rb @@ -5,14 +5,13 @@ class Video < ActiveRecord::Base belongs_to :user belongs_to :videoable, :polymorphic => true - validates_presence_of :remote_video_url, :unless => :embed_code? - validates_presence_of :embed_code?, :unless => :remote_video_url? validates_format_of :remote_video_url, :with => /\Ahttp(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/i, :message => "should look like a URL", :allow_blank => true - validates_format_of :remote_video_url, :with => /(youtube|vimeo).com/i, :message => "should be a youtube or video url", :allow_blank => true + validates_format_of :remote_video_url, :with => /(youtube|vimeo).com/i, :message => "should be a youtube or vimeo url", :allow_blank => true validates_format_of :embed_code, :with => /]+src="http(s?):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?"/i, :message => "should look like a URL", :allow_blank => true after_validation :process_video + after_validation :set_user def url_video? remote_video_url? @@ -31,8 +30,6 @@ def video_src end end - #private - def process_video if embed_code? if embed_code =~ /]+?src="([^"]+)"/i @@ -71,4 +68,8 @@ def parse_youtube_url url def parse_vimeo_url url end + def set_user + self.user = current_user unless self.user.present? + end + end diff --git a/app/views/shared/forms/_media_items.fbml.haml b/app/views/shared/forms/_media_items.fbml.haml new file mode 100644 index 00000000..3d04d9b1 --- /dev/null +++ b/app/views/shared/forms/_media_items.fbml.haml @@ -0,0 +1,23 @@ +%h2 Upload or link to an image: +- @story.images.build if @story.images.empty? +- form.semantic_fields_for :images do |image_form| + = image_form.file_field :image + = image_form.input :remote_image_url, :required => false + %br + %br +%h2 Embed or link to a video (youtube only): +- @story.videos.build if @story.videos.empty? +- form.semantic_fields_for :videos do |video_form| + = video_form.input :embed_code, :required => false + = video_form.input :remote_video_url, :required => false + %br + %br +%h2 Link to an audio file (.mp3 only): +- @story.audios.build if @story.audios.empty? +- form.semantic_fields_for :audios do |audio_form| + = audio_form.input :url, :required => false + = audio_form.input :title, :required => false + = audio_form.input :album, :required => false + = audio_form.input :artist, :required => false + %br + %br diff --git a/app/views/shared/forms/_media_items.html.haml b/app/views/shared/forms/_media_items.html.haml new file mode 100644 index 00000000..3d04d9b1 --- /dev/null +++ b/app/views/shared/forms/_media_items.html.haml @@ -0,0 +1,23 @@ +%h2 Upload or link to an image: +- @story.images.build if @story.images.empty? +- form.semantic_fields_for :images do |image_form| + = image_form.file_field :image + = image_form.input :remote_image_url, :required => false + %br + %br +%h2 Embed or link to a video (youtube only): +- @story.videos.build if @story.videos.empty? +- form.semantic_fields_for :videos do |video_form| + = video_form.input :embed_code, :required => false + = video_form.input :remote_video_url, :required => false + %br + %br +%h2 Link to an audio file (.mp3 only): +- @story.audios.build if @story.audios.empty? +- form.semantic_fields_for :audios do |audio_form| + = audio_form.input :url, :required => false + = audio_form.input :title, :required => false + = audio_form.input :album, :required => false + = audio_form.input :artist, :required => false + %br + %br diff --git a/app/views/stories/_story_form.fbml.haml b/app/views/stories/_story_form.fbml.haml index 5c7579d0..53ee1634 100644 --- a/app/views/stories/_story_form.fbml.haml +++ b/app/views/stories/_story_form.fbml.haml @@ -4,3 +4,4 @@ = form.input :image_url = form.input :tags_string, :required => false = form.input :caption += render :partial => 'shared/forms/media_items', :locals => { :form => form } diff --git a/app/views/stories/_story_form.html.haml b/app/views/stories/_story_form.html.haml index a013e3e2..02fb961b 100644 --- a/app/views/stories/_story_form.html.haml +++ b/app/views/stories/_story_form.html.haml @@ -5,3 +5,4 @@ = form.input :tags_string, :required => false %ul#image_selector.jcarousel-skin-tango{:style => "left: 0px;"} = form.input :caption += render :partial => 'shared/forms/media_items', :locals => { :form => form } diff --git a/app/views/stories/new.fbml.haml b/app/views/stories/new.fbml.haml index 3127173f..09f4dec7 100644 --- a/app/views/stories/new.fbml.haml +++ b/app/views/stories/new.fbml.haml @@ -5,7 +5,7 @@ .panel_block .storyBlockWrap %h3= link_to 'Post an Article', new_article_path - - semantic_form_for @story, :url => stories_path do |form| + - semantic_form_for @story, :url => stories_path, :html => { :multipart => true } do |form| = render :partial => 'story_form', :locals => { :form => form } - form.buttons do -# TODO:: switch this to locale diff --git a/app/views/stories/new.html.haml b/app/views/stories/new.html.haml index 3127173f..09f4dec7 100644 --- a/app/views/stories/new.html.haml +++ b/app/views/stories/new.html.haml @@ -5,7 +5,7 @@ .panel_block .storyBlockWrap %h3= link_to 'Post an Article', new_article_path - - semantic_form_for @story, :url => stories_path do |form| + - semantic_form_for @story, :url => stories_path, :html => { :multipart => true } do |form| = render :partial => 'story_form', :locals => { :form => form } - form.buttons do -# TODO:: switch this to locale diff --git a/app/views/stories/show.fbml.haml b/app/views/stories/show.fbml.haml index a4bd6a0b..24a3f49d 100644 --- a/app/views/stories/show.fbml.haml +++ b/app/views/stories/show.fbml.haml @@ -23,6 +23,8 @@ - if @story.moderatable? = render :partial => 'shared/flag_form', :locals => { :flaggable => @story } + - if @story.media_item? + = render_media_items @story = render :partial => 'shared/comments', :locals => { :comments => @story.comments } = render :partial => 'shared/comment_form', :locals => { :commentable => @story } diff --git a/app/views/stories/show.html.haml b/app/views/stories/show.html.haml index a4bd6a0b..24a3f49d 100644 --- a/app/views/stories/show.html.haml +++ b/app/views/stories/show.html.haml @@ -23,6 +23,8 @@ - if @story.moderatable? = render :partial => 'shared/flag_form', :locals => { :flaggable => @story } + - if @story.media_item? + = render_media_items @story = render :partial => 'shared/comments', :locals => { :comments => @story.comments } = render :partial => 'shared/comment_form', :locals => { :commentable => @story } diff --git a/lib/acts_as_media_item.rb b/lib/acts_as_media_item.rb index 1a170eb6..2bc746c2 100644 --- a/lib/acts_as_media_item.rb +++ b/lib/acts_as_media_item.rb @@ -10,9 +10,16 @@ def self.included(base) module ClassMethods def acts_as_media_item - has_many :images, :as => :imageable - has_many :videos, :as => :videoable - has_many :audios, :as => :audioable + has_many :images, :as => :imageable, :dependent => :nullify + has_many :videos, :as => :videoable, :dependent => :destroy + has_many :audios, :as => :audioable, :dependent => :destroy + + accepts_nested_attributes_for :images, + :reject_if => proc { |attrs| attrs.all? { |k,v| v.blank? } } + accepts_nested_attributes_for :videos, + :reject_if => proc { |attrs| attrs.all? { |k,v| v.blank? } } + accepts_nested_attributes_for :audios, + :reject_if => proc { |attrs| attrs.all? { |k,v| v.blank? } } include Newscloud::Acts::MediaItem::InstanceMethods end