Skip to content
This repository has been archived by the owner on Dec 12, 2021. It is now read-only.

Commit

Permalink
adding episode 119
Browse files Browse the repository at this point in the history
  • Loading branch information
ryanb committed Jul 20, 2008
1 parent ffd5495 commit 1ce9a66
Show file tree
Hide file tree
Showing 74 changed files with 8,405 additions and 0 deletions.
3 changes: 3 additions & 0 deletions episode-119/README
@@ -0,0 +1,3 @@
Railscasts Episode #119: Session Based Model

http://railscasts.com/episodes/119
3 changes: 3 additions & 0 deletions episode-119/blog/.gitignore
@@ -0,0 +1,3 @@
tmp/*
log/*
*.sqlite3
4 changes: 4 additions & 0 deletions episode-119/blog/README
@@ -0,0 +1,4 @@
Railscasts Example Blog App
--

To setup the app, just run `rake setup`.
10 changes: 10 additions & 0 deletions episode-119/blog/Rakefile
@@ -0,0 +1,10 @@
# Add your own tasks in files placed in lib/tasks ending in .rake,
# for example lib/tasks/capistrano.rake, and they will automatically be available to Rake.

require(File.join(File.dirname(__FILE__), 'config', 'boot'))

require 'rake'
require 'rake/testtask'
require 'rake/rdoctask'

require 'tasks/rails'
22 changes: 22 additions & 0 deletions episode-119/blog/app/controllers/application.rb
@@ -0,0 +1,22 @@
# Filters added to this controller apply to all controllers in the application.
# Likewise, all the methods added will be available for all controllers.

class ApplicationController < ActionController::Base
helper :all # include all helpers, all the time

# See ActionController::RequestForgeryProtection for details
# Uncomment the :secret if you're not using the cookie session store
protect_from_forgery # :secret => '9346baedc099926e71cc3a3f39613aa6'

# See ActionController::Base for details
# Uncomment this to filter the contents of submitted sensitive data parameters
# from your application log (in this case, all fields with names like "password").
# filter_parameter_logging :password

private

def user_session
@user_session ||= UserSession.new(session)
end
helper_method :user_session
end
45 changes: 45 additions & 0 deletions episode-119/blog/app/controllers/articles_controller.rb
@@ -0,0 +1,45 @@
class ArticlesController < ApplicationController
def index
@articles = Article.find(:all)
end

def show
@article = Article.find(params[:id])
@comment = Comment.new(:article => @article)
end

def new
@article = Article.new
end

def create
@article = Article.new(params[:article])
if @article.save
flash[:notice] = "Successfully created article."
redirect_to @article
else
render :action => 'new'
end
end

def edit
@article = Article.find(params[:id])
end

def update
@article = Article.find(params[:id])
if @article.update_attributes(params[:article])
flash[:notice] = "Successfully updated article."
redirect_to @article
else
render :action => 'edit'
end
end

def destroy
@article = Article.find(params[:id])
@article.destroy
flash[:notice] = "Successfully destroyed article."
redirect_to articles_url
end
end
41 changes: 41 additions & 0 deletions episode-119/blog/app/controllers/comments_controller.rb
@@ -0,0 +1,41 @@
class CommentsController < ApplicationController
before_filter :authorize, :only => [:edit, :update]

def new
@comment = Comment.new
end

def create
@comment = Comment.new(params[:comment])
if @comment.save
user_session.add_comment(@comment)
flash[:notice] = "Successfully created comment."
redirect_to article_url(@comment.article_id)
else
render :action => 'new'
end
end

def edit
@comment = Comment.find(params[:id])
end

def update
@comment = Comment.find(params[:id])
if @comment.update_attributes(params[:comment])
flash[:notice] = "Successfully updated comment."
redirect_to article_url(@comment.article_id)
else
render :action => 'edit'
end
end

private

def authorize
unless user_session.can_edit_comment?(Comment.find(params[:id]))
flash[:error] = "You are no longer able to edit this comment."
redirect_to root_url
end
end
end
3 changes: 3 additions & 0 deletions episode-119/blog/app/helpers/application_helper.rb
@@ -0,0 +1,3 @@
# Methods added to this helper will be available to all templates in the application.
module ApplicationHelper
end
2 changes: 2 additions & 0 deletions episode-119/blog/app/helpers/articles_helper.rb
@@ -0,0 +1,2 @@
module ArticlesHelper
end
2 changes: 2 additions & 0 deletions episode-119/blog/app/helpers/comments_helper.rb
@@ -0,0 +1,2 @@
module CommentsHelper
end
23 changes: 23 additions & 0 deletions episode-119/blog/app/helpers/layout_helper.rb
@@ -0,0 +1,23 @@
# These helper methods can be called in your template to set variables to be used in the layout
# This module should be included in all views globally,
# to do so you may need to add this line to your ApplicationController
# helper :layout
module LayoutHelper
def title(page_title, show_title = true)
@content_for_title = page_title.to_s
@show_title = show_title
end

def show_title?
@show_title
end

def stylesheet(*args)
content_for(:head) { stylesheet_link_tag(*args.map(&:to_s)) }
end

def javascript(*args)
args = args.map { |arg| arg == :defaults ? arg : arg.to_s }
content_for(:head) { javascript_include_tag(*args) }
end
end
4 changes: 4 additions & 0 deletions episode-119/blog/app/models/article.rb
@@ -0,0 +1,4 @@
class Article < ActiveRecord::Base
has_many :comments, :dependent => :destroy
validates_presence_of :name, :content
end
4 changes: 4 additions & 0 deletions episode-119/blog/app/models/comment.rb
@@ -0,0 +1,4 @@
class Comment < ActiveRecord::Base
belongs_to :article
validates_presence_of :author_name, :content
end
14 changes: 14 additions & 0 deletions episode-119/blog/app/models/user_session.rb
@@ -0,0 +1,14 @@
class UserSession
def initialize(session)
@session = session
@session[:comment_ids] ||= []
end

def add_comment(comment)
@session[:comment_ids] << comment.id
end

def can_edit_comment?(comment)
@session[:comment_ids].include?(comment.id) && comment.created_at > 15.minutes.ago
end
end
16 changes: 16 additions & 0 deletions episode-119/blog/app/views/articles/_form.html.erb
@@ -0,0 +1,16 @@
<%= error_messages_for :article %>
<% form_for @article do |f| %>
<p>
<%= f.label :name %><br />
<%= f.text_field :name %>
</p>
<p>
<%= f.label :content %><br />
<%= f.text_area :content %>
</p>
<p>
<%= f.label :author_name %><br />
<%= f.text_field :author_name %>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
8 changes: 8 additions & 0 deletions episode-119/blog/app/views/articles/edit.html.erb
@@ -0,0 +1,8 @@
<% title "Edit Article" %>
<%= render :partial => 'form' %>

<p>
<%= link_to "Show", @article %> |
<%= link_to "View All", articles_path %>
</p>
11 changes: 11 additions & 0 deletions episode-119/blog/app/views/articles/index.html.erb
@@ -0,0 +1,11 @@
<% title "Articles" %>

<div id="articles">
<% for article in @articles %>
<h2>
<%= link_to h(article.name), article %>
<span class="comments">(<%= pluralize(article.comments.size, 'comment') %>)</span>
</h2>
<div class="author">from <%=h article.author_name %> on <%= article.created_at.strftime('%b %d, %Y') %></div>
<% end %>
</div>
5 changes: 5 additions & 0 deletions episode-119/blog/app/views/articles/new.html.erb
@@ -0,0 +1,5 @@
<% title "New Article" %>
<%= render :partial => 'form' %>

<p><%= link_to "Back to List", articles_path %></p>
15 changes: 15 additions & 0 deletions episode-119/blog/app/views/articles/show.html.erb
@@ -0,0 +1,15 @@
<% title @article.name %>

<p class="author"><em>from <%=h @article.author_name %></em></p>

<%= simple_format(@article.content) %>
<% unless @article.comments.empty? %>
<h2><%= pluralize(@article.comments.size, 'comment') %></h2>
<div id="comments">
<%= render :partial => @article.comments %>
</div>
<% end %>

<h3>Add your comment:</h3>
<%= render :partial => 'comments/form' %>
10 changes: 10 additions & 0 deletions episode-119/blog/app/views/comments/_comment.html.erb
@@ -0,0 +1,10 @@
<div class="comment">
<p>
<strong><%= link_to_unless comment.site_url.blank?, h(comment.author_name), h(comment.site_url) %></strong>
<em>on <%= comment.created_at.strftime('%b %d, %Y at %H:%M') %></em>
</p>
<%= simple_format(h(comment.content)) %>
<% if user_session.can_edit_comment? comment %>
<p><%= link_to "Edit", edit_comment_path(comment) %></p>
<% end %>
</div>
17 changes: 17 additions & 0 deletions episode-119/blog/app/views/comments/_form.html.erb
@@ -0,0 +1,17 @@
<%= error_messages_for :comment %>
<% form_for @comment do |f| %>
<%= f.hidden_field :article_id %>
<p>
<%= f.label :author_name, 'Name' %><br />
<%= f.text_field :author_name %>
</p>
<p>
<%= f.label :site_url, 'Website URL' %><br />
<%= f.text_field :site_url %>
</p>
<p>
<%= f.label :content, 'Comment' %><br />
<%= f.text_area :content, :rows => '12', :cols => 35 %>
</p>
<p><%= f.submit "Submit" %></p>
<% end %>
4 changes: 4 additions & 0 deletions episode-119/blog/app/views/comments/edit.html.erb
@@ -0,0 +1,4 @@
<% title "Edit Comment" %>
<%= render :partial => 'form' %>

4 changes: 4 additions & 0 deletions episode-119/blog/app/views/comments/new.html.erb
@@ -0,0 +1,4 @@
<% title "New Comment" %>
<%= render :partial => 'form' %>

22 changes: 22 additions & 0 deletions episode-119/blog/app/views/layouts/application.html.erb
@@ -0,0 +1,22 @@
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<title><%= h(yield(:title) || "Untitled") %></title>
<%= stylesheet_link_tag 'application' %>
<%= yield(:head) %>
</head>
<body>
<div id="container">
<%- flash.each do |name, msg| -%>
<%= content_tag :div, msg, :id => "flash_#{name}" %>
<%- end -%>
<%- if show_title? -%>
<h1><%=h yield(:title) %></h1>
<%- end -%>
<%= yield %>
</div>
</body>
</html>

0 comments on commit 1ce9a66

Please sign in to comment.