end
end
+
def show
- @feed_items = FeedItem.find_all_by_feed_name(params[:feed_name])
- redirect_to index_url if @feed_items == []
- respond_to do |format|
- format.html
- format.rss { render :layout => false }
+ if valid_feed_name?(params[:feed_name])
+ @feed_items = FeedItem.find_all_by_feed_name(params[:feed_name])
+ @feed_name = params[:feed_name]
+ respond_to do |format|
+ if @feed_items == []
+ flash[:notice] = "No items in feed #{params[:feed_name]}"
+ format.html { redirect_to index_url }
+ format.rss { render :layout => false }
+ else
+ format.html
+ format.rss { render :layout => false }
+ end
+ end
+ else
+ respond_to do |format|
+ flash[:notice] = "Invalid feed name"
+ format.html { redirect_to index_url }
+ format.rss { head :not_found}
+ end
end
end
+
def update
- item = FeedItem.find_by_feed_name_and_title(params[:feed_name], params[:title])
- if item
- if params[:description] == ''
- item.destroy
+ if valid_feed_name?(params[:new_feed_name])
+ item = FeedItem.find_by_feed_name_and_title(params[:new_feed_name], params[:title])
+ if item
+ if params[:description] == ''
+ destroy_item(item)
+ else
+ update_item(item)
+ end
else
- item.update_attribute(:description, params[:description])
+ create_item
+ end
+ else
+ respond_to do |format|
+ flash[:notice] = "Invalid feed name"
+ format.html { redirect_to index_url }
+ format.rss { head :not_found }
+ end
+ end
+ end
+
+
+ private
+
+ def valid_feed_name?(feed_name)
+ Rack::Utils::escape(feed_name) == feed_name and
+ Rack::Utils::unescape(feed_name) == feed_name and
+ feed_name != 'index' and
+ feed_name != 'show' and
+ feed_name != 'update' and
+ feed_name != 'action'
+ end
+
+
+ def create_item
+ item = FeedItem.new(:feed_name => params[:new_feed_name],
+ :title => params[:title],
+ :description => params[:description])
+ item.save!
+ flash[:notice] = "Element #{params[:title]} created"
+ respond_to do |format|
+ format.html { redirect_to feed_url(params[:new_feed_name]) }
+ format.rss { head :ok }
+ end
+ rescue ActiveRecord::RecordInvalid => error
+ flash[:notice] = "Element #{params[:title]} could not be created"
+ respond_to do |format|
+ format.html { redirect_to feed_url(params[:new_feed_name]) }
+ format.rss { head :unprocessable_entity }
+ end
+ end
+
+
+ def update_item(item)
+ if item.update_attribute(:description, params[:description])
+ flash[:notice] = "Element #{params[:title]} updated"
+ respond_to do |format|
+ format.html { redirect_to feed_url(params[:new_feed_name]) }
+ format.rss { head :ok }
end
else
- FeedItem.create(:feed_name => params[:feed_name],
- :title => params[:title],
- :description => params[:description])
+ flash[:notice] = "Element #{params[:title]} could not be updated"
+ respond_to do |format|
+ format.html { redirect_to feed_url(params[:new_feed_name]) }
+ format.rss { head :unprocessable_entity }
+ end
+ end
+ end
+
+
+ def destroy_item(item)
+ if item.destroy
+ flash[:notice] = "Element #{params[:title]} destroyed"
+ respond_to do |format|
+ format.html { redirect_to feed_url(params[:new_feed_name]) }
+ format.rss { head :ok }
+ end
+ else
+ flash[:notice] = "Element #{params[:title]} could not be destroyed"
+ respond_to do |format|
+ format.html { redirect_to feed_url(params[:new_feed_name]) }
+ format.rss { head :unprocessable_entity }
+ end
end
- redirect_to feed_url(params[:feed_name])
end
end
validates_presence_of :feed_name, :title, :description
validate :feed_name_must_be_legal
-protected
+private
def feed_name_must_be_legal
if Rack::Utils::escape(feed_name) != feed_name or
<p><%= link_to("List of all feeds", index_url) %></p>
<% form_tag :action => 'update' do %>
- <p>Set feed <%= text_field_tag :feed_name, h(params[:feed_name]), :size => 20 %>
+ <p>Set feed <%= text_field_tag :new_feed_name, h(params[:feed_name]), :size => 20 %>
to include <%= text_field_tag :title, '', :size => 30 %>
containing <%= text_field_tag :description, '', :size => 50 %>
<%= submit_tag 'Update' %></p>
xml.instruct! :xml, :version => "1.0"
xml.rss :version => "2.0" do
xml.channel do
- xml.title @feed_items[0].feed_name
- xml.link feed_url(@feed_items[0].feed_name, :rss)
+ xml.title @feed_name
+ xml.link feed_url(@feed_name, :rss)
for item in @feed_items
xml.item do
+++ /dev/null
-<h1>Feed#update</h1>
-<p>Find me in app/views/feed/update.html.erb</p>
<html>
<head>
<title>Feedcatcher</title>
+ <%= stylesheet_link_tag "feedcatcher", :media => :all %>
</head>
<body>
+ <% if flash[:notice] -%>
+ <div id="notice"><%= flash[:notice] %></div>
+ <% end -%>
<%= yield :layout %>
</body>
</html>
+++ /dev/null
-# Don't change this file!
-# Configure your app in config/environment.rb and config/environments/*.rb
-
-RAILS_ROOT = "#{File.dirname(__FILE__)}/.." unless defined?(RAILS_ROOT)
-
-module Rails
- class << self
- def boot!
- unless booted?
- preinitialize
- pick_boot.run
- end
- end
-
- def booted?
- defined? Rails::Initializer
- end
-
- def pick_boot
- (vendor_rails? ? VendorBoot : GemBoot).new
- end
-
- def vendor_rails?
- File.exist?("#{RAILS_ROOT}/vendor/rails")
- end
-
- def preinitialize
- load(preinitializer_path) if File.exist?(preinitializer_path)
- end
-
- def preinitializer_path
- "#{RAILS_ROOT}/config/preinitializer.rb"
- end
- end
-
- class Boot
- def run
- load_initializer
- Rails::Initializer.run(:set_load_path)
- end
- end
-
- class VendorBoot < Boot
- def load_initializer
- require "#{RAILS_ROOT}/vendor/rails/railties/lib/initializer"
- Rails::Initializer.run(:install_gem_spec_stubs)
- Rails::GemDependency.add_frozen_gem_path
- end
- end
-
- class GemBoot < Boot
- def load_initializer
- self.class.load_rubygems
- load_rails_gem
- require 'initializer'
- end
-
- def load_rails_gem
- if version = self.class.gem_version
- gem 'rails', version
- else
- gem 'rails'
- end
- rescue Gem::LoadError => load_error
- $stderr.puts %(Missing the Rails #{version} gem. Please `gem install -v=#{version} rails`, update your RAILS_GEM_VERSION setting in config/environment.rb for the Rails version you do have installed, or comment out RAILS_GEM_VERSION to use the latest version installed.)
- exit 1
- end
-
- class << self
- def rubygems_version
- Gem::RubyGemsVersion rescue nil
- end
-
- def gem_version
- if defined? RAILS_GEM_VERSION
- RAILS_GEM_VERSION
- elsif ENV.include?('RAILS_GEM_VERSION')
- ENV['RAILS_GEM_VERSION']
- else
- parse_gem_version(read_environment_rb)
- end
- end
-
- def load_rubygems
- require 'rubygems'
- min_version = '1.3.1'
- unless rubygems_version >= min_version
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version} (you have #{rubygems_version}). Please `gem update --system` and try again.)
- exit 1
- end
-
- rescue LoadError
- $stderr.puts %Q(Rails requires RubyGems >= #{min_version}. Please install RubyGems and try again: http://rubygems.rubyforge.org)
- exit 1
- end
-
- def parse_gem_version(text)
- $1 if text =~ /^[^#]*RAILS_GEM_VERSION\s*=\s*["']([!~<>=]*\s*[\d.]+)["']/
- end
-
- private
- def read_environment_rb
- File.read("#{RAILS_ROOT}/config/environment.rb")
- end
- end
- end
-end
-
-# All that for this:
-Rails.boot!
+++ /dev/null
-# MySQL. Versions 4.1 and 5.0 are recommended.
-#
-# Install the MySQL driver:
-# gem install mysql
-# On Mac OS X:
-# sudo gem install mysql -- --with-mysql-dir=/usr/local/mysql
-# On Mac OS X Leopard:
-# sudo env ARCHFLAGS="-arch i386" gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
-# This sets the ARCHFLAGS environment variable to your native architecture
-# On Windows:
-# gem install mysql
-# Choose the win32 build.
-# Install MySQL and put its /bin directory on your path.
-#
-# And be sure to use new-style password hashing:
-# http://dev.mysql.com/doc/refman/5.0/en/old-client.html
-development:
- adapter: mysql
- encoding: utf8
- reconnect: false
- database: feedcatcher_development
- pool: 5
- username: feedcatcher
- password:
- socket: /var/run/mysqld/mysqld.sock
-
-# Warning: The database defined as "test" will be erased and
-# re-generated from your development database when you run "rake".
-# Do not set this db to the same as development or production.
-test:
- adapter: mysql
- encoding: utf8
- reconnect: false
- database: feedcatcher_test
- pool: 5
- username: feedcatcher
- password:
- socket: /var/run/mysqld/mysqld.sock
-
-production:
- adapter: mysql
- encoding: utf8
- reconnect: false
- database: feedcatcher_production
- pool: 5
- username: feedcatcher
- password:
- socket: /var/run/mysqld/mysqld.sock
-
+++ /dev/null
-# Be sure to restart your server when you modify this file
-
-# Specifies gem version of Rails to use when vendor/rails is not present
-RAILS_GEM_VERSION = '2.3.2' unless defined? RAILS_GEM_VERSION
-
-# Bootstrap the Rails environment, frameworks, and default configuration
-require File.join(File.dirname(__FILE__), 'boot')
-
-Rails::Initializer.run do |config|
- # Settings in config/environments/* take precedence over those specified here.
- # Application configuration should go into files in config/initializers
- # -- all .rb files in that directory are automatically loaded.
-
- # Add additional load paths for your own custom dirs
- # config.load_paths += %W( #{RAILS_ROOT}/extras )
-
- # Specify gems that this application depends on and have them installed with rake gems:install
- # config.gem "bj"
- # config.gem "hpricot", :version => '0.6', :source => "http://code.whytheluckystiff.net"
- # config.gem "sqlite3-ruby", :lib => "sqlite3"
- # config.gem "aws-s3", :lib => "aws/s3"
-
- # Only load the plugins named here, in the order given (default is alphabetical).
- # :all can be used as a placeholder for all plugins not explicitly named
- # config.plugins = [ :exception_notification, :ssl_requirement, :all ]
-
- # Skip frameworks you're not going to use. To use Rails without a database,
- # you must remove the Active Record framework.
- # config.frameworks -= [ :active_record, :active_resource, :action_mailer ]
-
- # Activate observers that should always be running
- # config.active_record.observers = :cacher, :garbage_collector, :forum_observer
-
- # Set Time.zone default to the specified zone and make Active Record auto-convert to this zone.
- # Run "rake -D time" for a list of tasks for finding time zone names.
- config.time_zone = 'UTC'
-
- # The default locale is :en and all translations from config/locales/*.rb,yml are auto loaded.
- # config.i18n.load_path += Dir[Rails.root.join('my', 'locales', '*.{rb,yml}')]
- # config.i18n.default_locale = :de
-end
\ No newline at end of file
+++ /dev/null
-# Settings specified here will take precedence over those in config/environment.rb
-
-# In the development environment your application's code is reloaded on
-# every request. This slows down response time but is perfect for development
-# since you don't have to restart the webserver when you make code changes.
-config.cache_classes = false
-
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
-
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_view.debug_rjs = true
-config.action_controller.perform_caching = false
-
-# Don't care if the mailer can't send
-config.action_mailer.raise_delivery_errors = false
\ No newline at end of file
+++ /dev/null
-# Settings specified here will take precedence over those in config/environment.rb
-
-# The production environment is meant for finished, "live" apps.
-# Code is not reloaded between requests
-config.cache_classes = true
-
-# Full error reports are disabled and caching is turned on
-config.action_controller.consider_all_requests_local = false
-config.action_controller.perform_caching = true
-config.action_view.cache_template_loading = true
-
-# See everything in the log (default is :info)
-# config.log_level = :debug
-
-# Use a different logger for distributed setups
-# config.logger = SyslogLogger.new
-
-# Use a different cache store in production
-# config.cache_store = :mem_cache_store
-
-# Enable serving of images, stylesheets, and javascripts from an asset server
-# config.action_controller.asset_host = "http://assets.example.com"
-
-# Disable delivery errors, bad email addresses will be ignored
-# config.action_mailer.raise_delivery_errors = false
-
-# Enable threaded mode
-# config.threadsafe!
\ No newline at end of file
+++ /dev/null
-# Settings specified here will take precedence over those in config/environment.rb
-
-# The test environment is used exclusively to run your application's
-# test suite. You never need to work with it otherwise. Remember that
-# your test database is "scratch space" for the test suite and is wiped
-# and recreated between test runs. Don't rely on the data there!
-config.cache_classes = true
-
-# Log error messages when you accidentally call methods on nil.
-config.whiny_nils = true
-
-# Show full error reports and disable caching
-config.action_controller.consider_all_requests_local = true
-config.action_controller.perform_caching = false
-config.action_view.cache_template_loading = true
-
-# Disable request forgery protection in test environment
-config.action_controller.allow_forgery_protection = false
-
-# Tell Action Mailer not to deliver emails to the real world.
-# The :test delivery method accumulates sent emails in the
-# ActionMailer::Base.deliveries array.
-config.action_mailer.delivery_method = :test
-
-# Use SQL instead of Active Record's schema dumper when creating the test database.
-# This is necessary if your schema can't be completely dumped by the schema dumper,
-# like if you have constraints or database-specific column types
-# config.active_record.schema_format = :sql
\ No newline at end of file
--- /dev/null
+HTTP/1.1 200 OK \r
+Cache-Control: private, max-age=0, must-revalidate\r
+Connection: Keep-Alive\r
+Date: Wed, 22 Jul 2009 12:44:26 GMT\r
+Content-Type: application/rss+xml; charset=utf-8\r
+Etag: "e7d0d2fad560d3d17bc9fa379dff26d7"\r
+Server: WEBrick/1.3.1 (Ruby/1.8.6/2007-09-24)\r
+X-Runtime: 33\r
+Content-Length: 710\r
+\r
--- /dev/null
+HTTP/1.1 200 OK \r
+Cache-Control: private, max-age=0, must-revalidate\r
+Connection: Keep-Alive\r
+Date: Wed, 22 Jul 2009 12:46:46 GMT\r
+Content-Type: application/rss+xml; charset=utf-8\r
+Etag: "0fcd2f586381d34c341be820ea75fa9a"\r
+Server: WEBrick/1.3.1 (Ruby/1.8.6/2007-09-24)\r
+X-Runtime: 67\r
+Content-Length: 2528\r
+\r
+++ /dev/null
-# Be sure to restart your server when you modify this file.
-
-# You can add backtrace silencers for libraries that you're using but don't wish to see in your backtraces.
-# Rails.backtrace_cleaner.add_silencer { |line| line =~ /my_noisy_library/ }
-
-# You can also remove all the silencers if you're trying do debug a problem that might steem from framework code.
-# Rails.backtrace_cleaner.remove_silencers!
\ No newline at end of file
+++ /dev/null
-# Be sure to restart your server when you modify this file.
-
-# Add new inflection rules using the following format
-# (all these examples are active by default):
-# ActiveSupport::Inflector.inflections do |inflect|
-# inflect.plural /^(ox)$/i, '\1en'
-# inflect.singular /^(ox)en/i, '\1'
-# inflect.irregular 'person', 'people'
-# inflect.uncountable %w( fish sheep )
-# end
+++ /dev/null
-# Be sure to restart your server when you modify this file.
-
-# Add new mime types for use in respond_to blocks:
-# Mime::Type.register "text/richtext", :rtf
-# Mime::Type.register_alias "text/html", :iphone
+++ /dev/null
-# Be sure to restart your server when you modify this file.
-
-# These settings change the behavior of Rails 2 apps and will be defaults
-# for Rails 3. You can remove this initializer when Rails 3 is released.
-
-if defined?(ActiveRecord)
- # Include Active Record class name as root for JSON serialized output.
- ActiveRecord::Base.include_root_in_json = true
-
- # Store the full class name (including module namespace) in STI type column.
- ActiveRecord::Base.store_full_sti_class = true
-end
-
-# Use ISO 8601 format for JSON serialized times and dates.
-ActiveSupport.use_standard_json_time_format = true
-
-# Don't escape HTML entities in JSON, leave that for the #json_escape helper.
-# if you're including raw json in an HTML page.
-ActiveSupport.escape_html_entities_in_json = false
\ No newline at end of file
+++ /dev/null
-# Be sure to restart your server when you modify this file.
-
-# Your secret key for verifying cookie session data integrity.
-# If you change this key, all old sessions will become invalid!
-# Make sure the secret is at least 30 characters and all random,
-# no regular words or you'll be exposed to dictionary attacks.
-ActionController::Base.session = {
- :key => '_feedcatcher_session',
- :secret => 'e2dacfa1d2730be2dcd393fa4f91418f345cfe7285aeff9c447e6f263373474885ad6d5248d2dfbea6d141cddda30c9350d01058a89e135610e8f8481bb2097c'
-}
-
-# Use the database for sessions instead of the cookie-based default,
-# which shouldn't be used to store highly confidential information
-# (create the session table with "rake db:sessions:create")
-# ActionController::Base.session_store = :active_record_store
+++ /dev/null
-# Sample localization file for English. Add more files in this directory for other locales.
-# See http://github.com/svenfuchs/rails-i18n/tree/master/rails%2Flocale for starting points.
-
-en:
- hello: "Hello world"
\ No newline at end of file
--- /dev/null
+/* START:notice */
+#notice {
+ border: 2px solid red;
+ padding: 1em;
+ margin-bottom: 2em;
+ background-color: #f0f0f0;
+ font: bold smaller sans-serif;
+}
+/* END:notice */
+++ /dev/null
-ActionController::Routing::Routes.draw do |map|
- # The priority is based upon order of creation: first created -> highest priority.
-
- # Sample of regular route:
- # map.connect 'products/:id', :controller => 'catalog', :action => 'view'
- # Keep in mind you can assign values other than :controller and :action
-
- # Sample of named route:
- # map.purchase 'products/:id/purchase', :controller => 'catalog', :action => 'purchase'
- # This route can be invoked with purchase_url(:id => product.id)
-
- # Sample resource route (maps HTTP verbs to controller actions automatically):
- # map.resources :products
-
- # Sample resource route with options:
- # map.resources :products, :member => { :short => :get, :toggle => :post }, :collection => { :sold => :get }
-
- # Sample resource route with sub-resources:
- # map.resources :products, :has_many => [ :comments, :sales ], :has_one => :seller
-
- # Sample resource route with more complex sub-resources
- # map.resources :products do |products|
- # products.resources :comments
- # products.resources :sales, :collection => { :recent => :get }
- # end
-
- # Sample resource route within a namespace:
- # map.namespace :admin do |admin|
- # # Directs /admin/products/* to Admin::ProductsController (app/controllers/admin/products_controller.rb)
- # admin.resources :products
- # end
-
- map.index 'index.:format',
- :conditions => { :method => :get },
- :controller => 'feed',
- :action => 'index'
- map.feed ':feed_name.:format',
- :conditions => { :method => :get },
- :controller => 'feed',
- :action => 'show'
- map.update ':feed_name',
- :conditions => { :method => :post },
- :defaults => { :feed_name => nil },
- :controller => 'feed',
- :action => 'update'
-
- # You can have the root of your site routed with map.root -- just remember to delete public/index.html.
- map.root :controller => "feed"
-
- # See how all your routes lay out with "rake routes"
-
- # Install the default routes as the lowest priority.
- # Note: These default routes make all actions in every controller accessible via GET requests. You should
- # consider removing the them or commenting them out if you're using named routes and resources.
-# map.connect ':controller/:action/:id'
-# map.connect ':controller/:action/:id.:format'
-end