From acd80c1fc3212b41c0b05a8f5ac2ad7edc990751 Mon Sep 17 00:00:00 2001 From: Neil Smith Date: Wed, 22 Jul 2009 12:48:03 +0000 Subject: [PATCH] Added Flash[:notice] to HTML pages, fixed update code, done RSS rendering properly --- app/controllers/feed_controller.rb | 114 ++++++++++++++++++++++--- app/models/feed_item.rb | 2 +- app/views/feed/show.html.erb | 2 +- app/views/feed/show.rss.builder | 4 +- app/views/feed/update.html.erb | 2 - app/views/layouts/application.html.erb | 4 + heaaders.txt | 10 +++ headers.txt | 10 +++ public/stylesheets/feedcatcher.css | 9 ++ 9 files changed, 137 insertions(+), 20 deletions(-) delete mode 100644 app/views/feed/update.html.erb create mode 100644 heaaders.txt create mode 100644 headers.txt create mode 100644 public/stylesheets/feedcatcher.css diff --git a/app/controllers/feed_controller.rb b/app/controllers/feed_controller.rb index 71ab1df..2d6fee9 100644 --- a/app/controllers/feed_controller.rb +++ b/app/controllers/feed_controller.rb @@ -10,29 +10,115 @@ class FeedController < ApplicationController 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 diff --git a/app/models/feed_item.rb b/app/models/feed_item.rb index cf01358..75830a5 100644 --- a/app/models/feed_item.rb +++ b/app/models/feed_item.rb @@ -5,7 +5,7 @@ class FeedItem < ActiveRecord::Base 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 diff --git a/app/views/feed/show.html.erb b/app/views/feed/show.html.erb index 2a2b9b1..739584c 100644 --- a/app/views/feed/show.html.erb +++ b/app/views/feed/show.html.erb @@ -2,7 +2,7 @@

<%= link_to("List of all feeds", index_url) %>

<% form_tag :action => 'update' do %> -

Set feed <%= text_field_tag :feed_name, h(params[:feed_name]), :size => 20 %> +

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' %>

diff --git a/app/views/feed/show.rss.builder b/app/views/feed/show.rss.builder index 522b662..7fdfe20 100644 --- a/app/views/feed/show.rss.builder +++ b/app/views/feed/show.rss.builder @@ -2,8 +2,8 @@ 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 diff --git a/app/views/feed/update.html.erb b/app/views/feed/update.html.erb deleted file mode 100644 index 96fff67..0000000 --- a/app/views/feed/update.html.erb +++ /dev/null @@ -1,2 +0,0 @@ -

Feed#update

-

Find me in app/views/feed/update.html.erb

diff --git a/app/views/layouts/application.html.erb b/app/views/layouts/application.html.erb index ee2975d..1599adb 100644 --- a/app/views/layouts/application.html.erb +++ b/app/views/layouts/application.html.erb @@ -1,8 +1,12 @@ Feedcatcher + <%= stylesheet_link_tag "feedcatcher", :media => :all %> + <% if flash[:notice] -%> +
<%= flash[:notice] %>
+ <% end -%> <%= yield :layout %> diff --git a/heaaders.txt b/heaaders.txt new file mode 100644 index 0000000..bd7c636 --- /dev/null +++ b/heaaders.txt @@ -0,0 +1,10 @@ +HTTP/1.1 200 OK +Cache-Control: private, max-age=0, must-revalidate +Connection: Keep-Alive +Date: Wed, 22 Jul 2009 12:44:26 GMT +Content-Type: application/rss+xml; charset=utf-8 +Etag: "e7d0d2fad560d3d17bc9fa379dff26d7" +Server: WEBrick/1.3.1 (Ruby/1.8.6/2007-09-24) +X-Runtime: 33 +Content-Length: 710 + diff --git a/headers.txt b/headers.txt new file mode 100644 index 0000000..8ff770c --- /dev/null +++ b/headers.txt @@ -0,0 +1,10 @@ +HTTP/1.1 200 OK +Cache-Control: private, max-age=0, must-revalidate +Connection: Keep-Alive +Date: Wed, 22 Jul 2009 12:46:46 GMT +Content-Type: application/rss+xml; charset=utf-8 +Etag: "0fcd2f586381d34c341be820ea75fa9a" +Server: WEBrick/1.3.1 (Ruby/1.8.6/2007-09-24) +X-Runtime: 67 +Content-Length: 2528 + diff --git a/public/stylesheets/feedcatcher.css b/public/stylesheets/feedcatcher.css new file mode 100644 index 0000000..7623e22 --- /dev/null +++ b/public/stylesheets/feedcatcher.css @@ -0,0 +1,9 @@ +/* START:notice */ +#notice { + border: 2px solid red; + padding: 1em; + margin-bottom: 2em; + background-color: #f0f0f0; + font: bold smaller sans-serif; +} +/* END:notice */ -- 2.34.1