Archive for category Ruby On Rails

thinking-sphinx的排序

sphinx本身支持datetime、integer、float、string等类型的排序,但是thinking-sphinx在定义索引的时候给人造成的误区简直让人想骂娘!

indexes :accepted_id, :sortable => true

这行是假象,默认是用字符串排序,即使accepted_id 是整型的!

正确写法

 has :accepted_id, :type => :integer

这里声明accepted_id是个属性,支持integer类型的排序和索引!

唉,看文档是王道啊

没有评论

resque使用

resque 是ruby和redis结合做的一个消息队列,稳定性和成熟性还有待考察,但是,用起来真是很爽

安装

gem install resque --no-ri --no-rdoc

或者rails3直接写到Gemfile里面,然后bundle install

在rails或者ruby 的app里导入项目,然后require到resque和job文件

执行rake resque:work QUEUE=’*'或者针对个别的job单独启动,用起来太舒服了!!!!!!
不能忘了配置redis:)

案例

在app目录下建立jobs目录
在RAILS_ROOT/config/initializers/resque.rb中加入

 Dir["#{Rails.root}/app/jobs/*.rb"].each { |file| require file }

建立一个可执行的ruby文件job1.rb

class Job1
  @queue = :job1
  def self.perform(arg)
     p "your code here!!!"
  end
end

执行

rake resque:work QUEUE='*'

可以看到”your code here!!!” 类的字符串输出

没有评论

rails devise hook

1. 登录后的

Warden::Manager.before_logout do |user,auth,opts|
  user.update_attribute(:authentication_token, false)
  auth.cookies.delete('remember_token')
end

2.验证后的,在remember的时候可以向cookie里面塞入一个token

Warden::Manager.after_authentication do |record, auth, options|
    scope = options[:scope]
    remember_me = auth.params[scope].try(:fetch, :remember_me, nil)

    if Devise::TRUE_VALUES.include?(remember_me) && record.respond_to?(:remember_me!)
    record.remember_me!
    auth.cookies['remember_token'] = {
      :value => record.authentication_token,
      :expires => record.remember_expires_at
    }
  end
end

没有评论

rails3.1-invalid multibyte char (US-ASCII) (SyntaxError)

# Load the rails application
# encoding: utf-8
require File.expand_path('../application', __FILE__)

# Initialize the rails application
Review::Application.initialize!

WillPaginate::ViewHelpers.pagination_options[:previous_label] = '«上一页'
WillPaginate::ViewHelpers.pagination_options[:next_label] = '下一页»'

rails3.1必须用ruby1.9去跑,然而1.9的编码处置非常2

必须文件加上encoding才能顺利运行,否则就出现invalid multibyte char (US-ASCII) (SyntaxError)

当然,上面的配置在3.1中必然会报错,文件头也就是文件的第一行(new shit!!!),应该将# Load the rails application删掉,将encoding: utf-8放在第一行,fckkkkkkkkkkkkkk

3 Comments

rails migration 独立使用

将migration的rake任务从rails里面抠出来!!!

DB_ENV = "development"
ROOT = File.expand_path(File.dirname(__FILE__))
database_config = File.expand_path(File.dirname(__FILE__) + "/database.yml")
log_path = File.expand_path(File.dirname(__FILE__) + "/migration.log")

namespace :db do
  task :environment => :load_config do
    ActiveRecord::Base.establish_connection(YAML.load(File.new(database_config))[DB_ENV])
    ActiveRecord::Base.logger = Logger.new(log_path)
  end

  task :load_config do
    require 'active_record'
    ActiveRecord::Base.configurations = YAML.load(File.new(database_config))
  end

  desc '创建数据库'
  task :create => :load_config do
    create_database(ActiveRecord::Base.configurations[DB_ENV])
  end

  desc '删除数据库'
  task :drop => :load_config do
    config = ActiveRecord::Base.configurations[DB_ENV]
    begin
      drop_database(config)
    rescue Exception => e
      puts "Couldn't drop #{config['database']} : #{e.inspect}"
    end
  end

  desc "迁移数据库"
  task :migrate => :environment do
    ActiveRecord::Migration.verbose = ENV["VERBOSE"] ? ENV["VERBOSE"] == "true" : true
    ActiveRecord::Migrator.migrate("migrate", ENV["VERSION"] ? ENV["VERSION"].to_i : nil)
    Rake::Task["db:schema:dump"].invoke if ActiveRecord::Base.schema_format == :ruby
  end


  desc '重置数据库'
  task :reset => [ 'db:drop', 'db:setup' ]

  desc '重置数据库并且执行seed'
  task :setup => [ 'db:create', 'db:schema:load', 'db:seed' ]

  desc '执行 seed.rb'
  task :seed => :environment do
    seed_file = File.expand_path(File.dirname(__FILE__) + "/seed.rb")
    load(seed_file) if File.exist?(seed_file)
  end

  namespace :schema do
    desc "创建schema.rb"
    task :dump => :environment do
      require 'active_record/schema_dumper'
      File.open(File.expand_path(File.dirname(__FILE__) + "/schema.rb"), "wb") do |file|
        ActiveRecord::SchemaDumper.dump(ActiveRecord::Base.connection, file)
      end
      Rake::Task["db:schema:dump"].reenable
    end

    desc "load schema.rb到数据库"
    task :load => :environment do
      file = File.expand_path(File.dirname(__FILE__) + "/schema.rb")
      if File.exists?(file)
        load(file)
      else
        abort %{error}
      end
    end
  end

  namespace :structure do
    desc "导出sql文件"
    task :dump => :environment do
      abcs = ActiveRecord::Base.configurations
      case abcs[DB_ENV]["adapter"]
      when "mysql", "oci", "oracle"
        ActiveRecord::Base.establish_connection(abcs[DB_ENV])
        File.open(ROOT + "/#{DB_ENV}_structure.sql", "wb") do |f|
          f << ActiveRecord::Base.connection.structure_dump
        end
      else
        raise "不支持数据库类型: '#{abcs["test"]["adapter"]}'"
      end

      if ActiveRecord::Base.connection.supports_migrations?
        File.open(ROOT + "/#{DB_ENV}_structure.sql", "a") do |f|
          f << ActiveRecord::Base.connection.dump_schema_information
        end
      end
    end
  end

end

def drop_database(config)
  case config['adapter']
    when 'mysql'
      ActiveRecord::Base.establish_connection(config)
      ActiveRecord::Base.connection.drop_database config['database']
    else
      $stderr.puts "删除数据库出错"
  end
end

def create_database(config)
  case config['adapter']
    when 'mysql'
      @charset   = 'utf8'
      @collation = 'utf8_unicode_ci'
      begin
        ActiveRecord::Base.establish_connection(config.merge('database' => nil))
        ActiveRecord::Base.connection.create_database(config['database'], :charset => (@charset), :collation => (@collation))
        ActiveRecord::Base.establish_connection(config)
      rescue
        $stderr.puts "创建数据库出错"
      end
    else
      $stderr.puts "擦,就支持mysql"
  end
end

目录结构

.
|-- Rakefile
|-- database.yml
|-- migrate
|   `-- 20110124014258_old_version.rb
|   `-- 20110124014259_old_version.rb
`-- schema.rb

,

没有评论