rails中获取url信息的一些方法

如本机我测试域名为test.blog.zool.it:3000

打开的uri为 /post/Hello-World

fullurl为 http://test.blog.zool.it:3000/post/Hello-world

则rails的路由生成一下几个方法

domain(tld_length = 1)

取得域名

request.domain #=>  zool.it

request.domain(2) #=> blog.zool.it

subdomain(tld_length = 1)

subdomains(tld_length = 1)

取得子域名

request.subdomain #=>  "test.blog"

request.subdomain(2) #=> "test"

request.subdomain #=>  ["test", "blog"]

request.subdomain(2) #=> ["test"]

host()

取得主机名

request.host #=> "test.blog.zool.it"

host_with_port()

取得带端口的主机名

request.host_with_port #=> "test.blog.zool.it:3000"

raw_host_with_port()

代理服务器的主机名和端口

request.raw_host_with_port #=> "test.blog.zool.it:3000"

port()

取得由raw_host_with_port()获得的端口数值

request.port #=> 3000

port_string()

取得raw_host_with_port()获得的端口文本字符串

request.port_string #=> ":3000"

protocol()

取得当前使用网络协议

request.protocol #=> "http://"

scheme()

取得网络协议

request.scheme #=> "http"

request_uri()

request请求的uri地址

request.request_uri #=> "/posts/Hello-World"

server_port

server_port()

取得由env['SERVER_PORT']返回的端口值

``ruby
request.server_port #=> "3000"

ssl?()

当前是否在是用https加密协议


ruby
request.ssl?() #=> false

standard_port()

返回网络协议标准端口(http为80, https为443)


ruby
request.standard_port #=> 80

standard_port?()

判断当前协议是否是标准端口


ruby
request.standard_port? #=> false

url()

取得当前requset完整url


ruby
request.url #=> "http://test.blog.zool.it:3000/posts/Hello-World"
```

ruby中去除字符串空格的方法

使用 String#strip方法,去除所有空格

"    hello    ".strip   #=> "hello"

"\tgoodbye\r\n".strip   #=> "goodbye"
ruby 另外lstrip和rstrip分别去除字符串左右两端的空格
"  hello  ".lstrip   #=> "hello  "

"hello".lstrip       #=> "hello"

"  hello  ".rstrip   #=> "  hello"

"hello".rstrip       #=> "hello"

上述方法是返回字符串的copy,如要改变原字符串对象,使用 String#strip!, String#lstrip!, String#rstrip!。 如果对象没有改变则返回nil

"hello".rstrip!      #=> nil

rails3中提供软删除的插件

github地址

有时候,我们希望一条记录删除后仍旧保留在数据库里,这样我们可以在日后还有反悔查询的机会。

P.S. 在rails2时代, 这个功能由 acts_as_paranoid 这个插件实现.

代码胜千言

安装

在Gemfile里加入插件配置

gem 'immortal'

在你要做软删除的model里引用插件

class User < ActiveRecord::Base
  include Immortal
end

在users表的字段上加上deleted这个字段

rails g migration AddDeletedToUser deleted:boolean


class AddDeletedToUser < ActiveRecord::Migration
  def self.up
    add_column :users, :deleted, :boolean
  end

  def self.down
    remove_column :users, :deleted
  end
end

在控制台里测试

>user = User.create(:username => 'zool')
 => #<User id: 1, username: "zool", created_at: "2010-12-30 12:09:42", updated_at: "2010-12-30 12:09:42", deleted: nil>

>user.destroy
>User.all => # []

>User.find_by_sql("select * from users;")
 => [#<User id: 1, username: "zool", created_at: "2010-12-30 12:09:42", updated_at: "2010-12-30 12:09:42", deleted: true>] 

>User.where("id = 1").to_sql
 => "SELECT \"users\".* FROM \"users\" WHERE ((\"users\".\"deleted\" IS NULL OR \"users\".\"deleted\" = 'f')) AND (id = 1)"

rails中文配置

rails默认为英文,像一些model的验证提示都是英文。
按下面方法将其汉化

首先,在https://github.com/svenfuchs/rails-i18n/tree/master/rails/locale下载相应的语言包

中文选择 zh-CN.yml ,将其下载到config/locale下面

然后在config/application.rb里加入下面的配置

config.i18n.default_locale = :'zh-CN' 

这句话的意思是将rails的语言包默认为简体中文

然后重启服务器即可

效果

ruby-1.8.7-p302 > I18n.l Time.now
 => "2010年12月30日 星期四 10:11:21 CST" 

ruby-新年快乐

根据网上的源码改编

 ruby -e "((1..20).to_a+[6]*4).each{|i|puts ('#'*i*2).center(80)};puts;puts 'Happy New Year'.center(80)"

关键是center方法

"Happy New Year".center(80)

就是将字符串在80个字符的长度内居中

生成rails项目的实体关系图

实体关系图 == Entity-Relationship Diagrams

插件官网

首先安装Graphviz

% brew install cairo pango graphviz    # Homebrew on Mac OS X

% sudo port install graphviz           # Macports on Mac OS X

% sudo aptitude install graphviz       # Debian and Ubuntu

然后在开发环境中使用

group :development do
  gem "rails-erd"
end

安装

% bundle install

生成PDF

% rake erd

使用to_lang翻译ruby字符串

github地址

我的博客就是用这个gem来翻译文章标题的

安装

gem install to_lang

使用

ToLang必须初始配置一个google api key

api key 获取地址

require to_lang
ToLang.start(YOUR_GOOGLE_TRANSLATE_API_KEY)

然后就可以变魔术了

 > '你好'.to_english
 => "Hello" 
 > 'hotfix'.to_simplified_chinese
 => "修复" 
 > "Rails 有非常強大的路徑指派功能,讓我們看看有哪些設定方式吧".to_simplified_chinese_from_traditional_chinese
 => "Rails 有非常强大的路径指派功能,让我们看看有哪些设定方式吧" 

也可以直接用String#translate方法

hello world.translate(es)
=> hola mundo
a pie.translate(es, :from => en)
=> un pastel

所有支持的语言

to_afrikaans
to_albanian
to_arabic
to_basque
to_belarusian
to_bulgarian
to_catalan
to_simplified_chinese
to_traditional_chinese
to_croatian
to_czech
to_danish
to_dutch
to_english
to_estonian
to_filipino
to_finnish
to_french
to_galician
to_german
to_greek
to_haitian_creole
to_hebrew
to_hindi
to_hungarian
to_icelandic
to_indonesian
to_irish
to_italian
to_japanese
to_latvian
to_lithuanian
to_macedonian
to_malay
to_maltese
to_norwegian
to_persian
to_polish
to_portuguese
to_romanian
to_russian
to_serbian
to_slovak
to_slovenian
to_spanish
to_swahili
to_swedish
to_thai
to_turkish
to_ukrainian
to_vietnamese
to_welsh
to_yiddish

在rails中使用jquery

ails默认使用的是prototype这个库,如果要替换为jquery的话,按下面步骤做

首先替换public/javascript/rails.js为jquery的版本,
从github下载

覆盖public/javascript/rails.js

然后下载jquery

放到pubic/javascript/jquery.js

在config/application.rb里,将下面的注释取消

config.action_view.javascript_expansions[:defaults] = %w(jquery rails)

重启服务器

在vim中使用rvm

github地址

将plugin下载到你的vim plugin里

curl http://github.com/csexton/rvm.vim/raw/master/plugin/rvm.vim > ~/.vim/plugin/rvm.vim

编辑vimrc,加入下面的代码

set statusline+=%{exists('g:loaded_rvm')?rvm#statusline():''} 

我的autotest配置

放在 ~/.autotest里, 起到统一配置

其中我没有用mac,所以注释掉了growl的相关配置

#require "autotest/growl"

#require 'redgreen/autotest'

require "autotest/restart"
require 'autotest/timestamp'
require 'autotest_notification'
SPEAKING = false
DOOM_EDITION = false
BUUF = false
PENDING = false
STICKY = false
SUCCESS_SOUND = ''
FAILURE_SOUND = ''


Autotest.add_hook :initialize do |autotest|
  %w{.git .svn .hg .DS_Store ._* vendor tmp log doc}.each do |exception|
    autotest.add_exception(exception)
  end
end
#

#module Autotest::Growl

#

#  def self.growl title, msg, img, pri=0, stick="" 

#    system "growlnotify -n autotest --image #{img} -p #{pri} -m #{ msg.inspect} #{title} #{stick}" 

#  end

#  #

#  Autotest.add_hook :ran_command do |autotest|

#    results = [autotest.results].flatten.join("\n")

#    output = results.slice(/(\d+)\s+examples?,\s*(\d+)\s+failures?(,\s*(\d+)\s+pending)?/) 

#    if output  =~ /[1-9]\sfailures?/

#      growl "FAIL:", "#{output}", "~/Library/autotest/fail.png", 2, "-s" 

#    elsif output  =~ /[1-9]\spending?/

#      growl "PENDING:", "#{output}", "~/Library/autotest/pending.png", 2, "-s" 

#    else

#      growl "PASS:", "#{output}", "~/Library/autotest/pass.png" 

#    end

#  end

#

#end