Linode VPS, ubuntu 8.04, ruby on rails

Ubuntu 8.04
Ruby on Rails
Linode VPS

apt-get update
apt-get install build-essential
apt-get install phpmyadmin
apt-get install mysql-server mysql-common
apt-get install  zlib1g-dev  libssl-dev libreadline5-dev
apt-get install apache2-prefork-dev libapr1-dev
apt-get install imagemagick
apt-get install gettext
apt-get install subversion git-core
apt-get install ruby1.8 ruby1.8-dev ri1.8
apt-get install libncurses5-dev

ln -s /usr/bin/ruby1.8 /usr/bin/ruby
apt-get install libmysqlclient15-dev
apt-get install libmagick9-dev 
apt-get install libopenssl-ruby1.8


cd /tmp/
wget http://rubyforge.org/frs/download.php/55066/rubygems-1.3.2.tgz
tar xzvf rubygems-1.3.2.tgz 
cd rubygems-1.3.2
ruby setup.rb 
ln -s /usr/bin/gem1.8 /usr/bin/gem
gem sources -a http://gems.github.com
gem install mysql
gem install rails -v 2.3.2
gem install capistrano
gem install rmagick
gem install hpricot
gem install httparty

cd /tmp/
wget http://rubyforge.org/frs/download.php/51100/ruby-enterprise-1.8.6-20090201.tar.gz
tar xzvf ruby-enterprise-1.8.6-20090201.tar.gz 
./ruby-enterprise-1.8.6-20090201/installer
/opt/ruby-enterprise-1.8.6-20090201/bin/passenger-install-apache2-module
ln -s /opt/ruby-enterprise-1.8.6-20090201/ /opt/ruby
/opt/ruby/bin/gem  sources -a http://gems.github.com
/opt/ruby/bin/gem install capistrano
/opt/ruby/bin/gem install rmagick
/opt/ruby/bin/gem install hpricot
/opt/ruby/bin/gem install httparty

Rails nice search

Проблема: http://somehost.com/home/index?q=search_string

route:

  map.q '/q/:q', :controller => 'home', :action => 'index', :q => nil  

form:
<% form_tag({:controller => "home", :action => "search"}, :method => "get") do %>
  <%= text_field_tag :q %><br/>
  <%= submit_tag 'Търси' %><br/>
<% end %>	

controller:
  def search
    redirect_to q_url(:q => params[:q])
  end


Резултат: http://somehost.com/q/search_string

Как да прочетем rdoc, за инсталираните локално ruby gems?

Стартирай:

  gem server

Отвори:
http://localhost:8808/

FeedBurner Api - извличане статистика за "feed"

app/models/feed_burner.rb

class FeedBurner
  include HTTParty
  base_uri 'feedburner.google.com'  
  format :xml

  def self.get_feed_stats(uri)
    get('/awareness/1.0/GetFeedData', :query => {:uri => uri})       
  end
  ...
end

Controller:
stats = FeedBurner.get_feed_stats("[feed_uri]")

config/environment.rb
...
config.gem "httparty"
...

Използване на константа, като име на модел

Използване на константа/string като име на модел:

Hash с константи:

    rtypes = {
      ...
      "rapps"=>"RentApp",
      "sapps"=>"SaleApp",
      ...   
    }

Използване като имена на модели:
 rtypes.each_pair {|offer_type, model|
   offers = model.constantize.find :all
   ...
 }

Константата може и да не е с точното име на модела. Например SaleApp може да бъде sale_app, тогава става така:
 offers = model.classify.constantize.find :all

Генериране на RSS в Rails сайт/приложение

Примерно генериране на RSS в Rails сайт/приложение. Примера е от кода на sharesnippets.com

Controller:

  def rss
    begin
    user = User.find_by_login(params[:user])
      @page_title = user.login  + " at www.sharesnippets.com"
 
    @posts = Post.find :all, :conditions => {:private => false, :user_id => user.id}, 
:order => "created_at desc"
    respond_to do |format|
      format.xml  { render :layout => false }
    end
    rescue
      flash[:notice] = 'Няма такъв потребител !'
      redirect_to root_url
      return false      
    end  
  end


View: rss.xml.builder
xml.instruct!

xml.rss "version" => "2.0", "xmlns:dc" => "http://purl.org/dc/elements/1.1/" do
  xml.channel do

    xml.title @page_title
    xml.link root_url
    xml.pubDate CGI.rfc1123_date(@posts.first.updated_at) if @posts.any?
    xml.description @page_title

    @posts.each do |post|
      xml.item do
        xml.title post.title
        xml.link url_for(:only_path => false, :controller => 'posts', 
:action => 'show', :id => post.permalink)
        xml.description post.body.gsub(/\n/, "<br />")
        xml.pubDate CGI.rfc1123_date(post.created_at)
        xml.guid url_for(:only_path => false, :controller => 'posts', 
:action => 'show',:id => post.permalink)
        xml.author post.user.login
      end
    end

  end
end

Rails sitemap generator

Controller:

  def sitemap 
    @posts = Post.find :all, :conditions => {:private => false}
    respond_to do |format|
      format.xml  { render :layout => false }
    end    
  end

Helper:
  def w3c_date(date)
    date.utc.strftime("%Y-%m-%dT%H:%M:%S+00:00")
  end

View: sitemap.xml.builder
xml.instruct!

xml.urlset 
  "xmlns" => "http://www.sitemaps.org/schemas/sitemap/0.9",
  "xsi:schemaLocation"=>"http://www.sitemaps.org/schemas/sitemap/0.9
  http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd", 
  "xmlns"=>"http://www.sitemaps.org/schemas/sitemap/0.9" do
  xml.url do
    xml.loc         "http://www.sharesnippets.com"
    xml.lastmod     w3c_date(Time.now)
    xml.changefreq  "always"
  end

  @posts.each do |post|
    xml.url do
      xml.loc         url_for(:only_path => false, :controller => 'post', :action => 'show', :id => post.id)
      xml.lastmod     w3c_date(post.created_at)
      xml.changefreq  "weekly"
      xml.priority    "0.9"
    end
  end
end


route:
  map.connect "sitemap.xml", :controller => "home", :action => "sitemap"  

subversion and rails project

svn remove log/* --force
svn commit -m "removing all logs from subversion"
svn propset svn:ignore "*.log" log/ --force
svn update log/
svn commit -m "Ignoring all files in /log/ ending in .log"
svn propset svn:ignore "*" tmp/sessions tmp/cache tmp/sockets
svn commit -m "Ignoring all files in /tmp/"
svn remove tmp/*
svn propset svn:ignore "*" tmp/
svn update tmp/
svn commit -m "ignore tmp/ content"

Rails multiple site application theme managment

  before_filter :get_site
  attr_reader :site
  theme :get_theme, :get_theme_site
 
 
  def get_site
    url = request.domain(request.subdomains.size + (request.subdomains.first == 'www' ? 0 : 1))
    @site ||= Site.find_by_url(url) || Site.find(:first, :order => 'id')
  end
 
  def get_theme
    site.theme
  end
 
  def get_theme_site
    site.id.to_s
  end

Още