My name is Kyrre and I''m a 17-year-old web design student from Norway.
I''ve only been doing Rails for about a month now, and because of my
lack of mastery, I could sure use your help achieving my goals.
This is my remake of http://pastie.org/187538. My goals are to make it
RESTful (1, 2), move
more logic into the models (3) and generally clean things up. How am I
doing so far?
1. http://scottraymond.net/2006/7/20/refactoring-to-rest
2. http://www.therailsway.com/2007/2/13/signout-part-1
3. http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model
Content:
config/routes.rb
controllers/ads_controller.rb
controllers/ads_activate_controller.rb
controllers/categories_controller.rb
controllers/parent_categories_controller.rb
models/ad.rb
models/category.rb
models/parent_category.rb
--
config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.resources :sites
map.resources :ads, :collection => { :feed => :get }, :member =>
{ :ad_activate => :put }
map.resources :users, :member => { :suspend => :put, :settings
=> :get, :unsuspend => :put, :purge => :delete }, :has_many =>
[:posts]
map.activate ''/activate/:user_activation_code'', :controller
=>
''users'', :action => ''user_activate'',
:user_activation_code => nil
map.signup ''/join'', :controller =>
''users'', :action => ''new''
map.login ''/login'', :controller =>
''sessions'', :action => ''new''
map.logout ''/logout'', :controller =>
''sessions'', :action =>
''destroy''
map.settings ''/settings'', :controller =>
''users'', :action =>
''settings''
map.resource :session
map.resource :pages
map.slug '':slug'', :controller => ''ads'',
:action => ''list''
map.root :controller => ''main'', :action =>
''index''
map.connect '':controller/:action/:id''
map.connect '':controller/:action/:id.:format''
end
--
controllers/ads_controller.rb
class AdsController < ApplicationController
def index
@category = Category.find_by_slug(params[:slug])
if @category
@ads = @category.ads.all_active
@requested_category = @category.name + '' in '' +
@category.parent_category.name
else
@category = ParentCategory.find_by_slug(params[:slug])
if @category
@ads = @category.all_ads
@requested_category = @category.name
else
flash[:warning] = "invalid request"
redirect_to root_path
end
end
end
def show
@ad = Ad.find_by_id(params[:id])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
end
end
def new
if (params[:email] != params[:email_confirmation])
flash[:warning] = "e-mails don''t match"
redirect_to create_ads_path
else
@author = Author.find_by_email(params[:email])
if @author.blank?
@author = Author.new
@author.email = params[:email]
@author.ip = request.env[''REMOTE_ADDR'']
@author.save
end
@ad = Category.find_by_id(params[:category]).ads.new
@ad.title = params[:title]
@ad.ad = params[:ad].gsub("\n", "<br />")
@ad.expiration = Time.now + 30.days
@ad.author = @author
@ad.author_ip = request.env[''REMOTE_ADDR'']
@ad.save
@ad.images(params["image_attachments"])
Mail.deliver_activation(@ad, @author.email)
flash[:notice] = "ad pending activation"
end
end
def create
@parents = ParentCategory.find :all, :order => ''name
ASC''
end
def edit
@ad = Ad.find_by_activation_code(params[:activation_code])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
else
end
end
def update
@ad = Ad.find_by_activation_code(params[:activation_code])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
else
@ad.ad = params[:ad].gsub("\n", "<br />")
@ad.title = params[:title]
if @ad.save
@ad.images(params["image_attachments"])
flash[:notice] = "ad updated"
else
flash[:warning] = "error updating ad"
end
redirect_to edit_ads_path, :activation_code =>
@ad.activation_code
end
end
def destroy
@ad = Ad.find_by_activation_code(params[:id])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
else
@ad.destroy
flash[:notice] = "ad removed"
redirect_to root_path
end
end
def feed
@ads = Ad.all_active
respond_to do |format|
format.rss { render :layout => false }
format.atom # index.atom.builder
end
end
end
--
controllers/ads_activate_controller.rb
class AdsActivateController < ApplicationController
def create
@ad = Ad.find_by_activation_code(params[:activation_code])
if (@ad.nil?)
flash[:warning] = "error activating ad"
redirect_to root_path
else
if @ad.activate_ad(params[:activation_code])
flash[:notice] = "ad activated"
Mail.deliver_activated(@ad, @ad.author.email)
redirect_to :action => ''edit'', :activation_code
=>
@ad.activation_code
else
flash[:warning] = "error activating ad"
redirect_to root_path
end
end
end
end
--
controllers/categories_controller.rb
class CategoriesController < ApplicationController
def index
@display_data = Category.display_paged_data(params[:page])
@parents = ParentCategory.find(:all)
@parent_categories = @parents.collect { |p| [p.name, p.id] }
end
def create
@category = Category.new
@category.name = params[:new_category]
@category.slug = params[:new_category].split.join.downcase
@category.parent_category_id = params[:ParentCategory][:id]
@category.save!
flash[:notice] = "new category created"
redirect_to :action => ''category''
end
def update
@category = Category.find_by_id(params[:id])
if @category.nil?
flash[:warning] = "invalid category"
end
if @category.update_attributes(params[:category])
flash[:notice] = "category updated"
else
if params[:category].nil?
flash[:warning] = "nothing to do"
else
flash[:warning] = "error updating category"
end
end
redirect_to :action => ''category''
end
def destroy
category = Category.find(params[:id])
category.destroy
flash[:notice] = "category deleted"
redirect_to :action => ''category''
end
end
--
controllers/parent_categories_controller.rb
class ParentCategoriesController < ApplicationController
def show
@display_data = ParentCategory.display_paged_data(params[:page])
end
def create
@parent = ParentCategory.new
@parent.name = params[:parent_category]
@parent.slug = params[:parent_category].split.join.downcase
@parent.save!
flash[:notice] = "parent category created"
redirect_to :action => ''parent_category''
end
def update
@parent_category = ParentCategory.find_by_id(params[:id])
if @parent_category.nil?
flash[:warning] = "invalid parent category"
redirect_to :action => ''parent_category''
end
if @parent_category.update_attributes(params[:parent_category])
flash[:notice] = "parent category updated"
else
if params[:parent_category].nil?
flash[:warning] = "nothing to do"
else
flash[:warning] = "error updating parent category"
end
end
redirect_to :action => ''parent_category''
end
def destroy
parent = ParentCategory.find(params[:id])
parent.destroy
flash[:notice] = "parent category deleted"
redirect_to :action => ''parent_category''
end
end
--
models/ad.rb
require ''uuid''
class Ad < ActiveRecord::Base
belongs_to :category
belongs_to :author
validate :expiration_is_set
def expiration_is_set
if expiration.nil?
expiration = Time.now + 30.days
end
end
def expire!
self.expiration = Time.now - 1.day
self.save
end
def extend!
self.expiration = Time.now + 30.days
self.save
end
def reset!
self.active = false
self.save
end
def expired?
self.expiration < Time.now
end
def self.all_active
find(:all, :conditions => [''expiration > ? and active =
?'',
Time.now, true], :order => ''created_at ASC'')
end
def select_category
@parent_category = ParentCategory.find_by_id(params[:id])
end
def show_form
@category = Category.find_by_id(params[:id])
end
def images(attachments)
return unless attachments.respond_to? :each
attachments.each do |image|
attachment = self.attachments.build(:uploaded_data => image)
attachment.save
end
end
def activate_ad(conf)
if self.activation_code == conf and !self.active?
self.active = true
if self.save
return true
else
return false
end
else
return false
end
end
protected
def before_create
self.activation_code = UUID.new
self.email = DateTime.now.to_s(:generate_hash) +
$generatedKeyCount.to_s.rjust(5, ''0'') + "@" + DOMAIN
$generatedKeyCount = $generatedKeyCount + 1
if ($generatedKeyCount > 99999)
$generatedKeyCount = 1
end
end
end
--
models/category.rb
class Category < ActiveRecord::Base
has_many :ads
belongs_to :parent_category
validates_presence_of :name
validates_uniqueness_of :name, :case_sensitive => false
validates_length_of :name, :within => 4..40
validates_presence_of :slug
validates_uniqueness_of :slug, :case_sensitive => false
validates_length_of :slug, :within => 3..40
end
--
models/parent_category.rb
class ParentCategory < ActiveRecord::Base
has_many :categories do
def in_order
find(:all, :order => ''name ASC'')
end
end
def all_ads
@subcategories = self.categories
@results = []
@subcategories.each { |c| c.ads.all_active.each { |a| @results <<
a } }
return @results
end
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
My name is Kyrre and I''m a 17-year-old web design student from Norway.
I''ve only been doing Rails for about a month now, and because of my
lack of mastery, I could sure use your help achieving my goals.
This is my remake of http://pastie.org/187538. My goals are to make it
RESTful (1, 2), move
more logic into the models (3) and generally clean things up. How am I
doing so far?
1. http://scottraymond.net/2006/7/20/refactoring-to-rest
2. http://www.therailsway.com/2007/2/13/signout-part-1
3. http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model
Content:
config/routes.rb
controllers/ads_controller.rb
controllers/ads_activate_controller.rb
controllers/categories_controller.rb
controllers/parent_categories_controller.rb
models/ad.rb
models/category.rb
models/parent_category.rb
--
config/routes.rb
ActionController::Routing::Routes.draw do |map|
map.resources :sites
map.resources :ads, :collection => { :feed => :get }, :member =>
{ :ad_activate => :put }
map.resources :users, :member => { :suspend => :put, :settings
=> :get, :unsuspend => :put, :purge => :delete }, :has_many =>
[:posts]
map.activate ''/activate/:user_activation_code'', :controller
=>
''users'', :action => ''user_activate'',
:user_activation_code => nil
map.signup ''/join'', :controller =>
''users'', :action => ''new''
map.login ''/login'', :controller =>
''sessions'', :action => ''new''
map.logout ''/logout'', :controller =>
''sessions'', :action =>
''destroy''
map.settings ''/settings'', :controller =>
''users'', :action =>
''settings''
map.resource :session
map.resource :pages
map.slug '':slug'', :controller => ''ads'',
:action => ''list''
map.root :controller => ''main'', :action =>
''index''
map.connect '':controller/:action/:id''
map.connect '':controller/:action/:id.:format''
end
--
controllers/ads_controller.rb
class AdsController < ApplicationController
def index
@category = Category.find_by_slug(params[:slug])
if @category
@ads = @category.ads.all_active
@requested_category = @category.name + '' in '' +
@category.parent_category.name
else
@category = ParentCategory.find_by_slug(params[:slug])
if @category
@ads = @category.all_ads
@requested_category = @category.name
else
flash[:warning] = "invalid request"
redirect_to root_path
end
end
end
def show
@ad = Ad.find_by_id(params[:id])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
end
end
def new
if (params[:email] != params[:email_confirmation])
flash[:warning] = "e-mails don''t match"
redirect_to create_ads_path
else
@author = Author.find_by_email(params[:email])
if @author.blank?
@author = Author.new
@author.email = params[:email]
@author.ip = request.env[''REMOTE_ADDR'']
@author.save
end
@ad = Category.find_by_id(params[:category]).ads.new
@ad.title = params[:title]
@ad.ad = params[:ad].gsub("\n", "<br />")
@ad.expiration = Time.now + 30.days
@ad.author = @author
@ad.author_ip = request.env[''REMOTE_ADDR'']
@ad.save
@ad.images(params["image_attachments"])
Mail.deliver_activation(@ad, @author.email)
flash[:notice] = "ad pending activation"
end
end
def create
@parents = ParentCategory.find :all, :order => ''name
ASC''
end
def edit
@ad = Ad.find_by_activation_code(params[:activation_code])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
else
end
end
def update
@ad = Ad.find_by_activation_code(params[:activation_code])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
else
@ad.ad = params[:ad].gsub("\n", "<br />")
@ad.title = params[:title]
if @ad.save
@ad.images(params["image_attachments"])
flash[:notice] = "ad updated"
else
flash[:warning] = "error updating ad"
end
redirect_to edit_ads_path, :activation_code =>
@ad.activation_code
end
end
def destroy
@ad = Ad.find_by_activation_code(params[:id])
if (@ad.nil?)
flash[:warning] = "ad doesn''t exist"
redirect_to root_path
else
@ad.destroy
flash[:notice] = "ad removed"
redirect_to root_path
end
end
def feed
@ads = Ad.all_active
respond_to do |format|
format.rss { render :layout => false }
format.atom # index.atom.builder
end
end
end
--
controllers/ads_activate_controller.rb
class AdsActivateController < ApplicationController
def create
@ad = Ad.find_by_activation_code(params[:activation_code])
if (@ad.nil?)
flash[:warning] = "error activating ad"
redirect_to root_path
else
if @ad.activate_ad(params[:activation_code])
flash[:notice] = "ad activated"
Mail.deliver_activated(@ad, @ad.author.email)
redirect_to :action => ''edit'', :activation_code
=>
@ad.activation_code
else
flash[:warning] = "error activating ad"
redirect_to root_path
end
end
end
end
--
controllers/categories_controller.rb
class CategoriesController < ApplicationController
def index
@display_data = Category.display_paged_data(params[:page])
@parents = ParentCategory.find(:all)
@parent_categories = @parents.collect { |p| [p.name, p.id] }
end
def create
@category = Category.new
@category.name = params[:new_category]
@category.slug = params[:new_category].split.join.downcase
@category.parent_category_id = params[:ParentCategory][:id]
@category.save!
flash[:notice] = "new category created"
redirect_to :action => ''category''
end
def update
@category = Category.find_by_id(params[:id])
if @category.nil?
flash[:warning] = "invalid category"
end
if @category.update_attributes(params[:category])
flash[:notice] = "category updated"
else
if params[:category].nil?
flash[:warning] = "nothing to do"
else
flash[:warning] = "error updating category"
end
end
redirect_to :action => ''category''
end
def destroy
category = Category.find(params[:id])
category.destroy
flash[:notice] = "category deleted"
redirect_to :action => ''category''
end
end
--
controllers/parent_categories_controller.rb
class ParentCategoriesController < ApplicationController
def show
@display_data = ParentCategory.display_paged_data(params[:page])
end
def create
@parent = ParentCategory.new
@parent.name = params[:parent_category]
@parent.slug = params[:parent_category].split.join.downcase
@parent.save!
flash[:notice] = "parent category created"
redirect_to :action => ''parent_category''
end
def update
@parent_category = ParentCategory.find_by_id(params[:id])
if @parent_category.nil?
flash[:warning] = "invalid parent category"
redirect_to :action => ''parent_category''
end
if @parent_category.update_attributes(params[:parent_category])
flash[:notice] = "parent category updated"
else
if params[:parent_category].nil?
flash[:warning] = "nothing to do"
else
flash[:warning] = "error updating parent category"
end
end
redirect_to :action => ''parent_category''
end
def destroy
parent = ParentCategory.find(params[:id])
parent.destroy
flash[:notice] = "parent category deleted"
redirect_to :action => ''parent_category''
end
end
--
models/ad.rb
require ''uuid''
class Ad < ActiveRecord::Base
belongs_to :category
belongs_to :author
validate :expiration_is_set
def expiration_is_set
if expiration.nil?
expiration = Time.now + 30.days
end
end
def expire!
self.expiration = Time.now - 1.day
self.save
end
def extend!
self.expiration = Time.now + 30.days
self.save
end
def reset!
self.active = false
self.save
end
def expired?
self.expiration < Time.now
end
def self.all_active
find(:all, :conditions => [''expiration > ? and active =
?'',
Time.now, true], :order => ''created_at ASC'')
end
def select_category
@parent_category = ParentCategory.find_by_id(params[:id])
end
def show_form
@category = Category.find_by_id(params[:id])
end
def images(attachments)
return unless attachments.respond_to? :each
attachments.each do |image|
attachment = self.attachments.build(:uploaded_data => image)
attachment.save
end
end
def activate_ad(conf)
if self.activation_code == conf and !self.active?
self.active = true
if self.save
return true
else
return false
end
else
return false
end
end
protected
def before_create
self.activation_code = UUID.new
self.email = DateTime.now.to_s(:generate_hash) +
$generatedKeyCount.to_s.rjust(5, ''0'') + "@" + DOMAIN
$generatedKeyCount = $generatedKeyCount + 1
if ($generatedKeyCount > 99999)
$generatedKeyCount = 1
end
end
end
--
models/category.rb
class Category < ActiveRecord::Base
has_many :ads
belongs_to :parent_category
validates_presence_of :name
validates_uniqueness_of :name, :case_sensitive => false
validates_length_of :name, :within => 4..40
validates_presence_of :slug
validates_uniqueness_of :slug, :case_sensitive => false
validates_length_of :slug, :within => 3..40
end
--
models/parent_category.rb
class ParentCategory < ActiveRecord::Base
has_many :categories do
def in_order
find(:all, :order => ''name ASC'')
end
end
def all_ads
@subcategories = self.categories
@results = []
@subcategories.each { |c| c.ads.all_active.each { |a| @results <<
a } }
return @results
end
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
That looks good to me, especially for someone with a month of Rails
I have a question about the nesting of posts under users:
map.resources :users, :member => { :suspend => :put, :settings
=> :get, :unsuspend => :put, :purge => :delete }, :has_many =>
[:posts]
You need a route that looks like users/3/posts/16
does :has_many =>[:posts] give you that? or do you need to nest it
map.resources :users, :member => { :suspend => :put, :settings
=> :get, :unsuspend => :put, :purge => :delete } do |users|
users.resources :post
end
perhaps someone could chime in here.
what is the output of "rake routes" ?
On Apr 27, 4:03 am, Mister Blood Rails
<bloodra...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> My name is Kyrre and I''m a 17-year-old web design student from
Norway.
> I''ve only been doing Rails for about a month now, and because of
my
> lack of mastery, I could sure use your help achieving my goals.
>
> This is my remake ofhttp://pastie.org/187538. My goals are to make it
> RESTful (1, 2), move
> more logic into the models (3) and generally clean things up. How am I
> doing so far?
>
> 1.http://scottraymond.net/2006/7/20/refactoring-to-rest
> 2.http://www.therailsway.com/2007/2/13/signout-part-1
> 3.http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model
>
> Content:
>
> config/routes.rb
> controllers/ads_controller.rb
> controllers/ads_activate_controller.rb
> controllers/categories_controller.rb
> controllers/parent_categories_controller.rb
> models/ad.rb
> models/category.rb
> models/parent_category.rb
>
> --
>
> config/routes.rb
>
> ActionController::Routing::Routes.draw do |map|
> map.resources :sites
> map.resources :ads, :collection => { :feed => :get }, :member =>
> { :ad_activate => :put }
> map.resources :users, :member => { :suspend => :put, :settings
> => :get, :unsuspend => :put, :purge => :delete }, :has_many =>
> [:posts]
> map.activate ''/activate/:user_activation_code'',
:controller =>
> ''users'', :action => ''user_activate'',
:user_activation_code => nil
> map.signup ''/join'', :controller =>
''users'', :action => ''new''
> map.login ''/login'', :controller =>
''sessions'', :action => ''new''
> map.logout ''/logout'', :controller =>
''sessions'', :action =>
> ''destroy''
> map.settings ''/settings'', :controller =>
''users'', :action =>
> ''settings''
> map.resource :session
> map.resource :pages
> map.slug '':slug'', :controller =>
''ads'', :action => ''list''
> map.root :controller => ''main'', :action =>
''index''
> map.connect '':controller/:action/:id''
> map.connect '':controller/:action/:id.:format''
> end
>
> --
>
> controllers/ads_controller.rb
>
> class AdsController < ApplicationController
> def index
> @category = Category.find_by_slug(params[:slug])
> if @category
> @ads = @category.ads.all_active
> @requested_category = @category.name + '' in '' +
> @category.parent_category.name
> else
> @category = ParentCategory.find_by_slug(params[:slug])
> if @category
> @ads = @category.all_ads
> @requested_category = @category.name
> else
> flash[:warning] = "invalid request"
> redirect_to root_path
> end
> end
> end
> def show
> @ad = Ad.find_by_id(params[:id])
> if (@ad.nil?)
> flash[:warning] = "ad doesn''t exist"
> redirect_to root_path
> end
> end
> def new
> if (params[:email] != params[:email_confirmation])
> flash[:warning] = "e-mails don''t match"
> redirect_to create_ads_path
> else
> @author = Author.find_by_email(params[:email])
> if @author.blank?
> @author = Author.new
> @author.email = params[:email]
> @author.ip = request.env[''REMOTE_ADDR'']
> @author.save
> end
> @ad = Category.find_by_id(params[:category]).ads.new
> @ad.title = params[:title]
> @ad.ad = params[:ad].gsub("\n", "<br />")
> @ad.expiration = Time.now + 30.days
> @ad.author = @author
> @ad.author_ip = request.env[''REMOTE_ADDR'']
> @ad.save
> @ad.images(params["image_attachments"])
> Mail.deliver_activation(@ad, @author.email)
> flash[:notice] = "ad pending activation"
> end
> end
> def create
> @parents = ParentCategory.find :all, :order => ''name
ASC''
> end
> def edit
> @ad = Ad.find_by_activation_code(params[:activation_code])
> if (@ad.nil?)
> flash[:warning] = "ad doesn''t exist"
> redirect_to root_path
> else
> end
> end
> def update
> @ad = Ad.find_by_activation_code(params[:activation_code])
> if (@ad.nil?)
> flash[:warning] = "ad doesn''t exist"
> redirect_to root_path
> else
> @ad.ad = params[:ad].gsub("\n", "<br />")
> @ad.title = params[:title]
> if @ad.save
> @ad.images(params["image_attachments"])
> flash[:notice] = "ad updated"
> else
> flash[:warning] = "error updating ad"
> end
> redirect_to edit_ads_path, :activation_code =>
> @ad.activation_code
> end
> end
> def destroy
> @ad = Ad.find_by_activation_code(params[:id])
> if (@ad.nil?)
> flash[:warning] = "ad doesn''t exist"
> redirect_to root_path
> else
> @ad.destroy
> flash[:notice] = "ad removed"
> redirect_to root_path
> end
> end
> def feed
> @ads = Ad.all_active
> respond_to do |format|
> format.rss { render :layout => false }
> format.atom # index.atom.builder
> end
> end
> end
>
> --
>
> controllers/ads_activate_controller.rb
>
> class AdsActivateController < ApplicationController
> def create
> @ad = Ad.find_by_activation_code(params[:activation_code])
> if (@ad.nil?)
> flash[:warning] = "error activating ad"
> redirect_to root_path
> else
> if @ad.activate_ad(params[:activation_code])
> flash[:notice] = "ad activated"
> Mail.deliver_activated(@ad, @ad.author.email)
> redirect_to :action => ''edit'',
:activation_code =>
> @ad.activation_code
> else
> flash[:warning] = "error activating ad"
> redirect_to root_path
> end
> end
> end
> end
>
> --
>
> controllers/categories_controller.rb
>
> class CategoriesController < ApplicationController
> def index
> @display_data = Category.display_paged_data(params[:page])
> @parents = ParentCategory.find(:all)
> @parent_categories = @parents.collect { |p| [p.name, p.id] }
> end
> def create
> @category = Category.new
> @category.name = params[:new_category]
> @category.slug = params[:new_category].split.join.downcase
> @category.parent_category_id = params[:ParentCategory][:id]
> @category.save!
> flash[:notice] = "new category created"
> redirect_to :action => ''category''
> end
> def update
> @category = Category.find_by_id(params[:id])
> if @category.nil?
> flash[:warning] = "invalid category"
> end
> if @category.update_attributes(params[:category])
> flash[:notice] = "category updated"
> else
> if params[:category].nil?
> flash[:warning] = "nothing to do"
> else
> flash[:warning] = "error updating category"
> end
> end
> redirect_to :action => ''category''
> end
> def destroy
> category = Category.find(params[:id])
> category.destroy
> flash[:notice] = "category deleted"
> redirect_to :action => ''category''
> end
> end
>
> --
>
> controllers/parent_categories_controller.rb
>
> class ParentCategoriesController < ApplicationController
> def show
> @display_data = ParentCategory.display_paged_data(params[:page])
> end
> def create
> @parent = ParentCategory.new
> @parent.name = params[:parent_category]
> @parent.slug = params[:parent_category].split.join.downcase
> @parent.save!
> flash[:notice] = "parent category created"
> redirect_to :action => ''parent_category''
> end
> def update
> @parent_category = ParentCategory.find_by_id(params[:id])
> if @parent_category.nil?
> flash[:warning] = "invalid parent category"
> redirect_to :action => ''parent_category''
> end
> if @parent_category.update_attributes(params[:parent_category])
> flash[:notice] = "parent category updated"
> else
> if params[:parent_category].nil?
> flash[:warning] = "nothing to do"
> else
> flash[:warning] = "error updating parent category"
> end
> end
> redirect_to :action => ''parent_category''
> end
> def destroy
> parent = ParentCategory.find(params[:id])
> parent.destroy
> flash[:notice] = "parent category deleted"
> redirect_to :action => ''parent_category''
> end
> end
>
> --
>
> models/ad.rb
>
> require ''uuid''
> class Ad < ActiveRecord::Base
> belongs_to :category
> belongs_to :author
> validate :expiration_is_set
> def expiration_is_set
> if expiration.nil?
> expiration = Time.now + 30.days
> end
> end
> def expire!
> self.expiration = Time.now - 1.day
> self.save
> end
> def extend!
> self.expiration = Time.now + 30.days
> self.save
> end
> def reset!
> self.active = false
> self.save
> end
> def expired?
> self.expiration < Time.now
> end
> def self.all_active
> find(:all, :conditions => [''expiration > ? and active =
?'',
> Time.now, true], :order => ''created_at ASC'')
> end
> def select_category
> @parent_category = ParentCategory.find_by_id(params[:id])
> end
> def show_form
> @category = Category.find_by_id(params[:id])
> end
> def images(attachments)
> return unless attachments.respond_to? :each
> attachments.each do |image|
> attachment = self.attachments.build(:uploaded_data => image)
> attachment.save
> end
> end
> def activate_ad(conf)
> if self.activation_code == conf and !self.active?
> self.active = true
> if self.save
> return true
> else
> return false
> end
> else
> return false
> end
> end
> protected
> def before_create
> self.activation_code = UUID.new
> self.email = DateTime.now.to_s(:generate_hash) +
> $generatedKeyCount.to_s.rjust(5, ''0'') + "@" +
DOMAIN
> $generatedKeyCount = $generatedKeyCount + 1
> if ($generatedKeyCount > 99999)
> $generatedKeyCount = 1
> end
> end
> end
>
> --
>
> models/category.rb
>
> class Category < ActiveRecord::Base
> has_many :ads
> belongs_to :parent_category
> validates_presence_of :name
> validates_uniqueness_of :name, :case_sensitive => false
> validates_length_of :name, :within => 4..40
> validates_presence_of :slug
> validates_uniqueness_of :slug, :case_sensitive => false
> validates_length_of :slug, :within => 3..40
> end
>
> --
>
> models/parent_category.rb
>
> class ParentCategory < ActiveRecord::Base
> has_many :categories do
>
def in_order> find(:all, :order => ''name ASC'')
> end
> end
> def all_ads
> @subcategories = self.categories
> @results = []
> @subcategories.each { |c| c.ads.all_active.each { |a| @results <<
> a } }
> return @results
> end
> end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
I guess posts should have been plural
map.resources :users, :member => { :suspend => :put, :settings
=> :get, :unsuspend => :put, :purge => :delete } do |users|
users.resources :posts # posts, not post
end
On Apr 27, 7:45 am, Ruby Freak
<twscann...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org>
wrote:> That looks good to me, especially for someone with a month of Rails
>
> I have a question about the nesting of posts under users:
>
> map.resources :users, :member => { :suspend => :put, :settings
> => :get, :unsuspend => :put, :purge => :delete }, :has_many =>
> [:posts]
>
> You need a route that looks like users/3/posts/16
> does :has_many =>[:posts] give you that? or do you need to nest it
>
> map.resources :users, :member => { :suspend => :put, :settings
> => :get, :unsuspend => :put, :purge => :delete } do |users|
> users.resources :post
> end
>
> perhaps someone could chime in here.
>
> what is the output of "rake routes" ?
>
> On Apr 27, 4:03 am, Mister Blood Rails
<bloodra...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:
>
> > My name is Kyrre and I''m a 17-year-old web design student
from Norway.
> > I''ve only been doing Rails for about a month now, and because
of my
> > lack of mastery, I could sure use your help achieving my goals.
>
> > This is my remake ofhttp://pastie.org/187538. My goals are to make it
> > RESTful (1, 2), move
> > more logic into the models (3) and generally clean things up. How am I
> > doing so far?
>
> > 1.http://scottraymond.net/2006/7/20/refactoring-to-rest
> > 2.http://www.therailsway.com/2007/2/13/signout-part-1
> > 3.http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model
>
> > Content:
>
> > config/routes.rb
> > controllers/ads_controller.rb
> > controllers/ads_activate_controller.rb
> > controllers/categories_controller.rb
> > controllers/parent_categories_controller.rb
> > models/ad.rb
> > models/category.rb
> > models/parent_category.rb
>
> > --
>
> > config/routes.rb
>
> > ActionController::Routing::Routes.draw do |map|
> > map.resources :sites
> > map.resources :ads, :collection => { :feed => :get }, :member
=>
> > { :ad_activate => :put }
> > map.resources :users, :member => { :suspend => :put, :settings
> > => :get, :unsuspend => :put, :purge => :delete }, :has_many
=>
> > [:posts]
> > map.activate ''/activate/:user_activation_code'',
:controller =>
> > ''users'', :action =>
''user_activate'', :user_activation_code => nil
> > map.signup ''/join'', :controller =>
''users'', :action => ''new''
> > map.login ''/login'', :controller =>
''sessions'', :action => ''new''
> > map.logout ''/logout'', :controller =>
''sessions'', :action =>
> > ''destroy''
> > map.settings ''/settings'', :controller =>
''users'', :action =>
> > ''settings''
> > map.resource :session
> > map.resource :pages
> > map.slug '':slug'', :controller =>
''ads'', :action => ''list''
> > map.root :controller => ''main'', :action =>
''index''
> > map.connect '':controller/:action/:id''
> > map.connect '':controller/:action/:id.:format''
> > end
>
> > --
>
> > controllers/ads_controller.rb
>
> > class AdsController < ApplicationController
> > def index
> > @category = Category.find_by_slug(params[:slug])
> > if @category
> > @ads = @category.ads.all_active
> > @requested_category = @category.name + '' in ''
+
> > @category.parent_category.name
> > else
> > @category = ParentCategory.find_by_slug(params[:slug])
> > if @category
> > @ads = @category.all_ads
> > @requested_category = @category.name
> > else
> > flash[:warning] = "invalid request"
> > redirect_to root_path
> > end
> > end
> > end
> > def show
> > @ad = Ad.find_by_id(params[:id])
> > if (@ad.nil?)
> > flash[:warning] = "ad doesn''t exist"
> > redirect_to root_path
> > end
> > end
> > def new
> > if (params[:email] != params[:email_confirmation])
> > flash[:warning] = "e-mails don''t match"
> > redirect_to create_ads_path
> > else
> > @author = Author.find_by_email(params[:email])
> > if @author.blank?
> > @author = Author.new
> > @author.email = params[:email]
> > @author.ip = request.env[''REMOTE_ADDR'']
> > @author.save
> > end
> > @ad = Category.find_by_id(params[:category]).ads.new
> > @ad.title = params[:title]
> > @ad.ad = params[:ad].gsub("\n", "<br
/>")
> > @ad.expiration = Time.now + 30.days
> > @ad.author = @author
> > @ad.author_ip = request.env[''REMOTE_ADDR'']
> > @ad.save
> > @ad.images(params["image_attachments"])
> > Mail.deliver_activation(@ad, @author.email)
> > flash[:notice] = "ad pending activation"
> > end
> > end
> > def create
> > @parents = ParentCategory.find :all, :order => ''name
ASC''
> > end
> > def edit
> > @ad = Ad.find_by_activation_code(params[:activation_code])
> > if (@ad.nil?)
> > flash[:warning] = "ad doesn''t exist"
> > redirect_to root_path
> > else
> > end
> > end
> > def update
> > @ad = Ad.find_by_activation_code(params[:activation_code])
> > if (@ad.nil?)
> > flash[:warning] = "ad doesn''t exist"
> > redirect_to root_path
> > else
> > @ad.ad = params[:ad].gsub("\n", "<br
/>")
> > @ad.title = params[:title]
> > if @ad.save
> > @ad.images(params["image_attachments"])
> > flash[:notice] = "ad updated"
> > else
> > flash[:warning] = "error updating ad"
> > end
> > redirect_to edit_ads_path, :activation_code =>
> > @ad.activation_code
> > end
> > end
> > def destroy
> > @ad = Ad.find_by_activation_code(params[:id])
> > if (@ad.nil?)
> > flash[:warning] = "ad doesn''t exist"
> > redirect_to root_path
> > else
> > @ad.destroy
> > flash[:notice] = "ad removed"
> > redirect_to root_path
> > end
> > end
> > def feed
> > @ads = Ad.all_active
> > respond_to do |format|
> > format.rss { render :layout => false }
> > format.atom # index.atom.builder
> > end
> > end
> > end
>
> > --
>
> > controllers/ads_activate_controller.rb
>
> > class AdsActivateController < ApplicationController
> > def create
> > @ad = Ad.find_by_activation_code(params[:activation_code])
> > if (@ad.nil?)
> > flash[:warning] = "error activating ad"
> > redirect_to root_path
> > else
> > if @ad.activate_ad(params[:activation_code])
> > flash[:notice] = "ad activated"
> > Mail.deliver_activated(@ad, @ad.author.email)
> > redirect_to :action => ''edit'',
:activation_code =>
> > @ad.activation_code
> > else
> > flash[:warning] = "error activating ad"
> > redirect_to root_path
> > end
> > end
> > end
> > end
>
> > --
>
> > controllers/categories_controller.rb
>
> > class CategoriesController < ApplicationController
> > def index
> > @display_data = Category.display_paged_data(params[:page])
> > @parents = ParentCategory.find(:all)
> > @parent_categories = @parents.collect { |p| [p.name, p.id] }
> > end
> > def create
> > @category = Category.new
> > @category.name = params[:new_category]
> > @category.slug = params[:new_category].split.join.downcase
> > @category.parent_category_id = params[:ParentCategory][:id]
> > @category.save!
> > flash[:notice] = "new category created"
> > redirect_to :action => ''category''
> > end
> > def update
> > @category = Category.find_by_id(params[:id])
> > if @category.nil?
> > flash[:warning] = "invalid category"
> > end
> > if @category.update_attributes(params[:category])
> > flash[:notice] = "category updated"
> > else
> > if params[:category].nil?
> > flash[:warning] = "nothing to do"
> > else
> > flash[:warning] = "error updating category"
> > end
> > end
> > redirect_to :action => ''category''
> > end
> > def destroy
> > category = Category.find(params[:id])
> > category.destroy
> > flash[:notice] = "category deleted"
> > redirect_to :action => ''category''
> > end
> > end
>
> > --
>
> > controllers/parent_categories_controller.rb
>
> > class ParentCategoriesController < ApplicationController
> > def show
> > @display_data = ParentCategory.display_paged_data(params[:page])
> > end
> > def create
> > @parent = ParentCategory.new
> > @parent.name = params[:parent_category]
> > @parent.slug = params[:parent_category].split.join.downcase
> > @parent.save!
> > flash[:notice] = "parent category created"
> > redirect_to :action => ''parent_category''
> > end
> > def update
> > @parent_category = ParentCategory.find_by_id(params[:id])
> > if @parent_category.nil?
> > flash[:warning] = "invalid parent category"
> > redirect_to :action => ''parent_category''
> > end
> > if @parent_category.update_attributes(params[:parent_category])
> > flash[:notice] = "parent category updated"
> > else
> > if params[:parent_category].nil?
> > flash[:warning] = "nothing to do"
> > else
> > flash[:warning] = "error updating parent category"
> > end
> > end
> > redirect_to :action => ''parent_category''
> > end
> > def destroy
> > parent = ParentCategory.find(params[:id])
> > parent.destroy
> > flash[:notice] = "parent category deleted"
> > redirect_to :action => ''parent_category''
> > end
> > end
>
> > --
>
> > models/ad.rb
>
> > require ''uuid''
> > class Ad < ActiveRecord::Base
> > belongs_to :category
> > belongs_to :author
> > validate :expiration_is_set
> > def expiration_is_set
> > if expiration.nil?
> > expiration = Time.now + 30.days
> > end
> > end
> > def expire!
> > self.expiration = Time.now - 1.day
> > self.save
> > end
> > def extend!
> > self.expiration = Time.now + 30.days
> > self.save
> > end
> > def reset!
> > self.active = false
> > self.save
> > end
> > def expired?
> > self.expiration < Time.now
> > end
> > def self.all_active
> > find(:all, :conditions => [''expiration > ? and
active = ?'',
> > Time.now, true], :order => ''created_at ASC'')
> > end
> > def select_category
> > @parent_category = ParentCategory.find_by_id(params[:id])
> > end
> > def show_form
> > @category = Category.find_by_id(params[:id])
> > end
> > def images(attachments)
> > return unless attachments.respond_to? :each
> > attachments.each do
>
> ...
>
> read more »
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe@googlegroups.com
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---
@Ruby Freak: Yes, the has_many macro is the same as the nesting that you mention. @Mister Blood Rails: You''re off to a very good start here. In the AdsController it looks like you''ve got the ''new'' and ''create'' methods confused (in default Rails REST new gives you the form to fill out and create persists the data). Otherwise, the controllers look pretty good. In moving to the ''fat model, skinny controller'' concept, the blocks of code that have @some_instance_method on several consecutive lines are the ideal candidates to move into a model method. A couple of other observations/suggestions: - In your current AdsController#new, the block that sets the @author could be reduced to: @author = Author.find_or_create_by_email params[:email] @author.update_attribute :ip, request.env[''REMOTE_ADDR''] if @author.ip.blank? - Look into using ''form_for''. This will allow you to ''scope'' your input fields in such a way as to make create/new/update_attributes much simpler. These ActiveRecord::Base methods all accept a hash that works with the params hash provided by the controller. For example, your ads/new.html.erb could look something like: <% form_for :ad, :url=>ads_path do |f| %> <%= label :title, ''Title'' %> <%= f.text_field :title %> <%= label :title, ''Ad'' %> <%= f.text_field :ad %> ... <% end %> Then the code to create the ad would be simpler: @ad = Ad.new params[:ad].merge(:author=>@author, :author_id=> request.env[''REMOTE_ADDR'']) if @ad.save ... On Apr 27, 7:03 am, Mister Blood Rails <bloodra...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> My name is Kyrre and I''m a 17-year-old web design student from Norway. > I''ve only been doing Rails for about a month now, and because of my > lack of mastery, I could sure use your help achieving my goals. > > This is my remake ofhttp://pastie.org/187538. My goals are to make it > RESTful (1, 2), move > more logic into the models (3) and generally clean things up. How am I > doing so far? > > 1.http://scottraymond.net/2006/7/20/refactoring-to-rest > 2.http://www.therailsway.com/2007/2/13/signout-part-1 > 3.http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model > > Content: > > config/routes.rb > controllers/ads_controller.rb > controllers/ads_activate_controller.rb > controllers/categories_controller.rb > controllers/parent_categories_controller.rb > models/ad.rb > models/category.rb > models/parent_category.rb > > -- > > config/routes.rb > > ActionController::Routing::Routes.draw do |map| > map.resources :sites > map.resources :ads, :collection => { :feed => :get }, :member => > { :ad_activate => :put } > map.resources :users, :member => { :suspend => :put, :settings > => :get, :unsuspend => :put, :purge => :delete }, :has_many => > [:posts] > map.activate ''/activate/:user_activation_code'', :controller => > ''users'', :action => ''user_activate'', :user_activation_code => nil > map.signup ''/join'', :controller => ''users'', :action => ''new'' > map.login ''/login'', :controller => ''sessions'', :action => ''new'' > map.logout ''/logout'', :controller => ''sessions'', :action => > ''destroy'' > map.settings ''/settings'', :controller => ''users'', :action => > ''settings'' > map.resource :session > map.resource :pages > map.slug '':slug'', :controller => ''ads'', :action => ''list'' > map.root :controller => ''main'', :action => ''index'' > map.connect '':controller/:action/:id'' > map.connect '':controller/:action/:id.:format'' > end > > -- > > controllers/ads_controller.rb > > class AdsController < ApplicationController > def index > @category = Category.find_by_slug(params[:slug]) > if @category > @ads = @category.ads.all_active > @requested_category = @category.name + '' in '' + > @category.parent_category.name > else > @category = ParentCategory.find_by_slug(params[:slug]) > if @category > @ads = @category.all_ads > @requested_category = @category.name > else > flash[:warning] = "invalid request" > redirect_to root_path > end > end > end > def show > @ad = Ad.find_by_id(params[:id]) > if (@ad.nil?) > flash[:warning] = "ad doesn''t exist" > redirect_to root_path > end > end > def new > if (params[:email] != params[:email_confirmation]) > flash[:warning] = "e-mails don''t match" > redirect_to create_ads_path > else > @author = Author.find_by_email(params[:email]) > if @author.blank? > @author = Author.new > @author.email = params[:email] > @author.ip = request.env[''REMOTE_ADDR''] > @author.save > end > @ad = Category.find_by_id(params[:category]).ads.new > @ad.title = params[:title] > @ad.ad = params[:ad].gsub("\n", "<br />") > @ad.expiration = Time.now + 30.days > @ad.author = @author > @ad.author_ip = request.env[''REMOTE_ADDR''] > @ad.save > @ad.images(params["image_attachments"]) > Mail.deliver_activation(@ad, @author.email) > flash[:notice] = "ad pending activation" > end > end > def create > @parents = ParentCategory.find :all, :order => ''name ASC'' > end > def edit > @ad = Ad.find_by_activation_code(params[:activation_code]) > if (@ad.nil?) > flash[:warning] = "ad doesn''t exist" > redirect_to root_path > else > end > end > def update > @ad = Ad.find_by_activation_code(params[:activation_code]) > if (@ad.nil?) > flash[:warning] = "ad doesn''t exist" > redirect_to root_path > else > @ad.ad = params[:ad].gsub("\n", "<br />") > @ad.title = params[:title] > if @ad.save > @ad.images(params["image_attachments"]) > flash[:notice] = "ad updated" > else > flash[:warning] = "error updating ad" > end > redirect_to edit_ads_path, :activation_code => > @ad.activation_code > end > end > def destroy > @ad = Ad.find_by_activation_code(params[:id]) > if (@ad.nil?) > flash[:warning] = "ad doesn''t exist" > redirect_to root_path > else > @ad.destroy > flash[:notice] = "ad removed" > redirect_to root_path > end > end > def feed > @ads = Ad.all_active > respond_to do |format| > format.rss { render :layout => false } > format.atom # index.atom.builder > end > end > end > > -- > > controllers/ads_activate_controller.rb > > class AdsActivateController < ApplicationController > def create > @ad = Ad.find_by_activation_code(params[:activation_code]) > if (@ad.nil?) > flash[:warning] = "error activating ad" > redirect_to root_path > else > if @ad.activate_ad(params[:activation_code]) > flash[:notice] = "ad activated" > Mail.deliver_activated(@ad, @ad.author.email) > redirect_to :action => ''edit'', :activation_code => > @ad.activation_code > else > flash[:warning] = "error activating ad" > redirect_to root_path > end > end > end > end > > -- > > controllers/categories_controller.rb > > class CategoriesController < ApplicationController > def index > @display_data = Category.display_paged_data(params[:page]) > @parents = ParentCategory.find(:all) > @parent_categories = @parents.collect { |p| [p.name, p.id] } > end > def create > @category = Category.new > @category.name = params[:new_category] > @category.slug = params[:new_category].split.join.downcase > @category.parent_category_id = params[:ParentCategory][:id] > @category.save! > flash[:notice] = "new category created" > redirect_to :action => ''category'' > end > def update > @category = Category.find_by_id(params[:id]) > if @category.nil? > flash[:warning] = "invalid category" > end > if @category.update_attributes(params[:category]) > flash[:notice] = "category updated" > else > if params[:category].nil? > flash[:warning] = "nothing to do" > else > flash[:warning] = "error updating category" > end > end > redirect_to :action => ''category'' > end > def destroy > category = Category.find(params[:id]) > category.destroy > flash[:notice] = "category deleted" > redirect_to :action => ''category'' > end > end > > -- > > controllers/parent_categories_controller.rb > > class ParentCategoriesController < ApplicationController > def show > @display_data = ParentCategory.display_paged_data(params[:page]) > end > def create > @parent = ParentCategory.new > @parent.name = params[:parent_category] > @parent.slug = params[:parent_category].split.join.downcase > @parent.save! > flash[:notice] = "parent category created" > redirect_to :action => ''parent_category'' > end > def update > @parent_category = ParentCategory.find_by_id(params[:id]) > if @parent_category.nil? > flash[:warning] = "invalid parent category" > redirect_to :action => ''parent_category'' > end > if @parent_category.update_attributes(params[:parent_category]) > flash[:notice] = "parent category updated" > else > if params[:parent_category].nil? > flash[:warning] = "nothing to do" > else > flash[:warning] = "error updating parent category" > end > end > redirect_to :action => ''parent_category'' > end > def destroy > parent = ParentCategory.find(params[:id]) > parent.destroy > flash[:notice] = "parent category deleted" > redirect_to :action => ''parent_category'' > end > end > > -- > > models/ad.rb > > require ''uuid'' > class Ad < ActiveRecord::Base > belongs_to :category > belongs_to :author > validate :expiration_is_set > def expiration_is_set > if expiration.nil? > expiration = Time.now + 30.days > end > end > def expire! > self.expiration = Time.now - 1.day > self.save > end > def extend! > self.expiration = Time.now + 30.days > self.save > end > def reset! > self.active = false > self.save > end > def expired? > self.expiration < Time.now > end > def self.all_active > find(:all, :conditions => [''expiration > ? and active = ?'', > Time.now, true], :order => ''created_at ASC'') > end > def select_category > @parent_category = ParentCategory.find_by_id(params[:id]) > end > def show_form > @category = Category.find_by_id(params[:id]) > end > def images(attachments) > return unless attachments.respond_to? :each > attachments.each do |image| > attachment = self.attachments.build(:uploaded_data => image) > attachment.save > end > end > def activate_ad(conf) > if self.activation_code == conf and !self.active? > self.active = true > if self.save > return true > else > return false > end > else > return false > end > end > protected > def before_create > self.activation_code = UUID.new > self.email = DateTime.now.to_s(:generate_hash) + > $generatedKeyCount.to_s.rjust(5, ''0'') + "@" + DOMAIN > $generatedKeyCount = $generatedKeyCount + 1 > if ($generatedKeyCount > 99999) > $generatedKeyCount = 1 > end > end > end > > -- > > models/category.rb > > class Category < ActiveRecord::Base > has_many :ads > belongs_to :parent_category > validates_presence_of :name > validates_uniqueness_of :name, :case_sensitive => false > validates_length_of :name, :within => 4..40 > validates_presence_of :slug > validates_uniqueness_of :slug, :case_sensitive => false > validates_length_of :slug, :within => 3..40 > end > > -- > > models/parent_category.rb > > class ParentCategory < ActiveRecord::Base > has_many :categories do > def in_order > find(:all, :order => ''name ASC'') > end > end > def all_ads > @subcategories > ... > > read more »--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
Thanks a lot guys! Wonderful, wonderful advice! It''s looking better and better every day now! I''ll show you what I got ASAP... On Apr 28, 7:09 pm, AndyV <AndyVana...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> @Ruby Freak: Yes, the has_many macro is the same as the nesting that > you mention. > > @Mister Blood Rails: > You''re off to a very good start here. In the AdsController it looks > like you''ve got the ''new'' and ''create'' methods confused (in default > Rails REST new gives you the form to fill out and create persists the > data). Otherwise, the controllers look pretty good. > > In moving to the ''fat model, skinny controller'' concept, the blocks of > code that have @some_instance_method on several consecutive lines are > the ideal candidates to move into a model method. > > A couple of other observations/suggestions: > - In your current AdsController#new, the block that sets the @author > could be reduced to: > @author = Author.find_or_create_by_email params[:email] > @author.update_attribute :ip, request.env[''REMOTE_ADDR''] if > @author.ip.blank? > > - Look into using ''form_for''. This will allow you to ''scope'' your > input fields in such a way as to make create/new/update_attributes > much simpler. These ActiveRecord::Base methods all accept a hash that > works with the params hash provided by the controller. For example, > your ads/new.html.erb could look something like: > > <% form_for :ad, :url=>ads_path do |f| %> > <%= label :title, ''Title'' %> > <%= f.text_field :title %> > <%= label :title, ''Ad'' %> > <%= f.text_field :ad %> > ... > <% end %> > > Then the code to create the ad would be simpler: > @ad = Ad.new params[:ad].merge(:author=>@author, :author_id=> > request.env[''REMOTE_ADDR'']) > if @ad.save > ... > > On Apr 27, 7:03 am, Mister Blood Rails <bloodra...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > My name is Kyrre and I''m a 17-year-old web design student from Norway. > > I''ve only been doing Rails for about a month now, and because of my > > lack of mastery, I could sure use your help achieving my goals. > > > This is my remake ofhttp://pastie.org/187538. My goals are to make it > > RESTful (1, 2), move > > more logic into the models (3) and generally clean things up. How am I > > doing so far? > > > 1.http://scottraymond.net/2006/7/20/refactoring-to-rest > > 2.http://www.therailsway.com/2007/2/13/signout-part-1 > > 3.http://weblog.jamisbuck.org/2006/10/18/skinny-controller-fat-model > > > Content: > > > config/routes.rb > > controllers/ads_controller.rb > > controllers/ads_activate_controller.rb > > controllers/categories_controller.rb > > controllers/parent_categories_controller.rb > > models/ad.rb > > models/category.rb > > models/parent_category.rb > > > -- > > > config/routes.rb > > > ActionController::Routing::Routes.draw do |map| > > map.resources :sites > > map.resources :ads, :collection => { :feed => :get }, :member => > > { :ad_activate => :put } > > map.resources :users, :member => { :suspend => :put, :settings > > => :get, :unsuspend => :put, :purge => :delete }, :has_many => > > [:posts] > > map.activate ''/activate/:user_activation_code'', :controller => > > ''users'', :action => ''user_activate'', :user_activation_code => nil > > map.signup ''/join'', :controller => ''users'', :action => ''new'' > > map.login ''/login'', :controller => ''sessions'', :action => ''new'' > > map.logout ''/logout'', :controller => ''sessions'', :action => > > ''destroy'' > > map.settings ''/settings'', :controller => ''users'', :action => > > ''settings'' > > map.resource :session > > map.resource :pages > > map.slug '':slug'', :controller => ''ads'', :action => ''list'' > > map.root :controller => ''main'', :action => ''index'' > > map.connect '':controller/:action/:id'' > > map.connect '':controller/:action/:id.:format'' > > end > > > -- > > > controllers/ads_controller.rb > > > class AdsController < ApplicationController > > def index > > @category = Category.find_by_slug(params[:slug]) > > if @category > > @ads = @category.ads.all_active > > @requested_category = @category.name + '' in '' + > > @category.parent_category.name > > else > > @category = ParentCategory.find_by_slug(params[:slug]) > > if @category > > @ads = @category.all_ads > > @requested_category = @category.name > > else > > flash[:warning] = "invalid request" > > redirect_to root_path > > end > > end > > end > > def show > > @ad = Ad.find_by_id(params[:id]) > > if (@ad.nil?) > > flash[:warning] = "ad doesn''t exist" > > redirect_to root_path > > end > > end > > def new > > if (params[:email] != params[:email_confirmation]) > > flash[:warning] = "e-mails don''t match" > > redirect_to create_ads_path > > else > > @author = Author.find_by_email(params[:email]) > > if @author.blank? > > @author = Author.new > > @author.email = params[:email] > > @author.ip = request.env[''REMOTE_ADDR''] > > @author.save > > end > > @ad = Category.find_by_id(params[:category]).ads.new > > @ad.title = params[:title] > > @ad.ad = params[:ad].gsub("\n", "<br />") > > @ad.expiration = Time.now + 30.days > > @ad.author = @author > > @ad.author_ip = request.env[''REMOTE_ADDR''] > > @ad.save > > @ad.images(params["image_attachments"]) > > Mail.deliver_activation(@ad, @author.email) > > flash[:notice] = "ad pending activation" > > end > > end > > def create > > @parents = ParentCategory.find :all, :order => ''name ASC'' > > end > > def edit > > @ad = Ad.find_by_activation_code(params[:activation_code]) > > if (@ad.nil?) > > flash[:warning] = "ad doesn''t exist" > > redirect_to root_path > > else > > end > > end > > def update > > @ad = Ad.find_by_activation_code(params[:activation_code]) > > if (@ad.nil?) > > flash[:warning] = "ad doesn''t exist" > > redirect_to root_path > > else > > @ad.ad = params[:ad].gsub("\n", "<br />") > > @ad.title = params[:title] > > if @ad.save > > @ad.images(params["image_attachments"]) > > flash[:notice] = "ad updated" > > else > > flash[:warning] = "error updating ad" > > end > > redirect_to edit_ads_path, :activation_code => > > @ad.activation_code > > end > > end > > def destroy > > @ad = Ad.find_by_activation_code(params[:id]) > > if (@ad.nil?) > > flash[:warning] = "ad doesn''t exist" > > redirect_to root_path > > else > > @ad.destroy > > flash[:notice] = "ad removed" > > redirect_to root_path > > end > > end > > def feed > > @ads = Ad.all_active > > respond_to do |format| > > format.rss { render :layout => false } > > format.atom # index.atom.builder > > end > > end > > end > > > -- > > > controllers/ads_activate_controller.rb > > > class AdsActivateController < ApplicationController > > def create > > @ad = Ad.find_by_activation_code(params[:activation_code]) > > if (@ad.nil?) > > flash[:warning] = "error activating ad" > > redirect_to root_path > > else > > if @ad.activate_ad(params[:activation_code]) > > flash[:notice] = "ad activated" > > Mail.deliver_activated(@ad, @ad.author.email) > > redirect_to :action => ''edit'', :activation_code => > > @ad.activation_code > > else > > flash[:warning] = "error activating ad" > > redirect_to root_path > > end > > end > > end > > end > > > -- > > > controllers/categories_controller.rb > > > class CategoriesController < ApplicationController > > def index > > @display_data = Category.display_paged_data(params[:page]) > > @parents = ParentCategory.find(:all) > > @parent_categories = @parents.collect { |p| [p.name, p.id] } > > end > > def create > > @category = Category.new > > @category.name = params[:new_category] > > @category.slug = params[:new_category].split.join.downcase > > @category.parent_category_id = params[:ParentCategory][:id] > > @category.save! > > flash[:notice] = "new category created" > > redirect_to :action => ''category'' > > end > > def update > > @category = Category.find_by_id(params[:id]) > > if @category.nil? > > flash[:warning] = "invalid category" > > end > > if @category.update_attributes(params[:category]) > > flash[:notice] = "category updated" > > else > > if params[:category].nil? > > flash[:warning] = "nothing to do" > > else > > flash[:warning] = "error updating category" > > end > > end > > redirect_to :action => ''category'' > > end > > def destroy > > category = Category.find(params[:id]) > > category.destroy > > flash[:notice] = "category deleted" > > redirect_to :action => ''category'' > > end > > end > > > -- > > > controllers/parent_categories_controller.rb > > > class ParentCategoriesController < ApplicationController > > def show > > @display_data = ParentCategory.display_paged_data(params[:page]) > > end > > def create > > @parent = ParentCategory.new > > @parent.name = params[:parent_category] > > @parent.slug = params[:parent_category].split.join.downcase > > @parent.save! > > flash[:notice] = "parent category created" > > redirect_to :action => ''parent_category'' > > end > > def update > > @parent_category = ParentCategory.find_by_id(params[:id]) > > if @parent_category.nil? > > flash[:warning] = "invalid parent category" > > redirect_to :action => ''parent_category'' > > end > > if @parent_category.update_attributes(params[:parent_category]) > > flash[:notice] = "parent category updated" > > else > > if params[:parent_category].nil? > > flash[:warning] = "nothing to do" > > else > > flash[:warning] = "error updating parent category" > > end > > end > > redirect_to :action => ''parent_category'' > > end > > def destroy > > parent = ParentCategory.find(params[:id]) > > parent.destroy > > flash[:notice] = "parent category deleted" > > redirect_to :action => ''parent_category'' > > end > > end > > > -- > > > models/ad.rb > > > require ''uuid'' > > class Ad < ActiveRecord::Base > > belongs_to :category > > belongs_to :author > > ... > > read more »--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk-unsubscribe@googlegroups.com For more options, visit this group at http://groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---