by agate - Published: 2009-01-10 [4:32 下午] - Category: 程序编码

最近项目中使用了 sphinx 作为数据库的全文搜索引擎. 加之使用的是 ror 开发组合, 固然使用到了比较流行的 ultra sphinx plugin. 觉得十分易用就在这里记录一下使用的大致方式(就一 helloworld).

1. 当然是下载安装 sphinx.
可以到 http://www.sphinxsearch.com/downloads.html 网站下载最新的源码编译安装.
(ps 如果你要加入中文分词的支持就要安装 libmmseg. 编译前需要打个补丁. 或者直接使用作者打好补丁的进行编译安装. 具体的方式可以 google 一下)

2. 安装 rails 的 sphinx 插件 "ultra sphinx"
安装依赖 gem
$sudo gem install chronic
进入你的 rails 应用目录中
$./script/plugin install git://github.com/fauna/ultrasphinx.git

3. 开始使用.
其实具体的还是查阅官方 doc 比较好. 比较全面一些!
这里还是为了回顾方便, helloworld 来也!

第一步 [准备准备]
$rails sphinx -d mysql
$cd sphinx
$./script/plugin install git://github.com/fauna/ultrasphinx.git
$./script/generate scaffold post title:string body:text
$rake db:create:all
$rake db:migrate

(这些只是大步骤, 具体的什么数据库用户名密码设置这类的自己补上就是了. 还有, 目前 ultrasphinx 仅仅支持 mysql 和 PostgreSQL)

第二步 [声明 model 为 searchable]
编辑 [rails_root]/app/models/post.rb, 内容如下:

class Post < ActiveRecord::Base
  is_indexed :fields => ['created_at', 'title', 'body']
end

第三步 [配置/索引/启动]
首先复制配置文件的模板到 config/ultrasphinx 下.
$mkdir config/ultrasphinx
$cp vendor/plugins/ultrasphinx/examples/default.base config/ultrasphinx/

修改 default.base 中的 path 为这个 rails 工程的绝对地址

吧 <% path = "/opt/local/var/db/sphinx/" %>
改成 <% path = "/home/[你]/....." %>

$rake ultrasphinx:configure
$rake ultrasphinx:index
$rake ultrasphinx:daemon:start

(第一次执行时候,顺序不能颠倒!)

第四步 [添加点数据试试看]
添加数据我就不说了, 自己启动服务器到对应页面 new 几个出来. 然后重新索引 sphinx. 然后开启 rails 的 console:
$./script/console
>>@query = '自己写吧'
>>@search = Ultrasphinx::Search.new(:query => @query)
>>@search.run
>>@search.results

by agate - Published: 2008-12-25 [5:44 下午] - Category: 程序编码

默认情况下我们使用 rails 默认的 validates 来进行模型数据验证工作的时候常常会加上 message 参数来自定义我们的错误提示.

validates_presence_of :name, :message => 'is blank...'

出错的时候会提示

Name is blank...

但是要是我想显示

The name field is blank!

单靠改 message 的内容看来是不行的. 在 google 一番之后发现 ActiveRecord::Errors 这个类中有一个叫做 full_messages 的 helper function. 就是完成把出错的 field 的名字添加到 message 内容的前面的工作. 所以可以 override 一番. 就可以实现我们的功能了. 但是也许不小心会破坏过去的代码. 所以这里推荐一个插件( 由 rails 核心成员写的. )
Custom Error Message
其实十分简单, 它也是 override 了那个 helper function. 如果你不喜欢加插件的话自己在 lib 下面建立一个 ruby 文件就好了, 这里也顺便贴一下代码.

def full_messages
  full_messages = []

  @errors.each_key do |attr|
    @errors[attr].each do |msg|
    next if msg.nil?

      if attr == "base"
        full_messages << msg
      elsif msg =~ /^\^/
        full_messages << msg[1..-1]
      elsif msg.is_a? Proc
        full_messages << msg.call(@base)
      else
        full_messages << @base.class.human_attribute_name(attr) + " " + msg
      end
    end
  end

  return full_messages
end

使用方式:
在你需要自定义消息的前面加上 '^' 这个符号.(说白了就是很想正则告诉代码这是开始)

validates_presence_of :name, :message => '^The name field is blank!'

这样出错后就会显示:

The name field is blank!

Tags: [ , ] - Comments: Comments
by agate - Published: 2008-10-29 [3:39 下午] - Category: 程序编码

很早就在 "Web 开发大全 -- Ruby on Rails 版" 书中看到过 restful_authentication 这个鉴定插件了~ 但是一直都没使用过. 今天看到一个中文的 ROR 视频网站 -- rubycnrails.cn 上面用视频介绍了 restful_authentication 这个插件的使用(但是这位仁兄老是出错... 看着我好着急阿!) 呵呵! 于是我也试着使用了一番, 发现真的满好用的. 这里就记录一下, 顺便说一下需要注意的地方.

github 地址 http://github.com/technoweenie/restful-authentication/tree/master
(rubycnrails.cn 上面那个视频似乎是使用旧的版本... 大概不知道这个插件已经迁移到 github 上面了吧.)

安装:
$cd [your-rails-app]
$./script/plugin install git://github.com/technoweenie/restful-authentication.git

使用:
$./script/generate authenticated Model-Name [Controller-Name]
别忘了 rake 一下, 来建立你的数据库!

结果:
生成对应的 controller / model / view. 添加了对应的 routes: signup / login / logout. 当然, 还添加了

lib/authenticated_system.rb
lib/authenticated_test_helper.rb

这两个才是重要的插件功能! 其中 AuthenticatedSystem 中包含了诸如: logged_in?, current_kid 等重要方法! 到时候我们只需要在需要调用的 controller 中 include AuthenticatedSystem 就好了.

注意:
不要傻乎乎地学 README 中键入: ./script/generate authenticated user sessions 这个 s 最好不要!(不要说我违反了 RESTful 的理念, 我说的是最好不要!) 对于初学者来说先别加这个 s, 因为这个会带来很多配置上的模糊: 比如 routes.rb 中 resource 是定义为 'session', 但是设置具体命名路由的时候使用 controller 参数时又要设置为 'sessions'. 所以, 如果你对这里头的细节不是很清楚的话, 建议你改用单数作为这里控制器的名称:
$./script/generate authenticated user session 我建议这么写
当然! 你清除的话, 或者你不关心这个的话, 那还是写上那个 s 吧! 这样才够 RESTful!
其他很细致的内容还是看看源代码或者看看 Plugin 的 README 吧! 写得很不错!

by agate - Published: 2008-09-17 [6:07 下午] - Category: 程序编码

在使用 acts_as_voteable 插件开发的过程中, 发现这个插件是服务于 rails1.2.x 的. 但是在 rails2.0+ 下执行某些方法的时候会出现如下错误.

ArgumentError: The :dependent option expects either :destroy, :delete_all, or :nullify (true)

解决方法是修改#{RAILS_ROOT}/vendor/plugins/acts_as_voteable/lib/acts_as_voteable.rb
替换 :dependent => :true

:dependent => :nullify

就OK了. 这种方法同样适用于 acts_as_commentable 等此类插件. 因为作者只不过简单重写了一下.
注意的是, 这些插件默认情况下都是真对 MYSQL 编写的. 在 SQLite 下要注意需要修改插件 lib 目录下主文件中的 SQL 语句, 把 FALSE 替换为 '0', TRUE 替换为 't'.

by agate - Published: 2008-08-26 [10:48 下午] - Category: 程序编码

java的老习惯, 就奔着这个富文本编辑器了, 免得我再做一个图片和 flash 的上传组件~ 省时省力.

废话少说, 上地址:http://github.com/bilson/fckeditor/tree/master

使用方式:
1. 解压到 rails 项目中 vendor/plugins 目录下, 并重命名为 fckeditor
2. 在命令行下(rails 目录下)执行 $rake fckeditor:install

ps. 也许真的是 java 中毒太深, 老是觉得配置文件是什么文本啊 xml 啊这类的东东. 在为 fckeditor 上传文件类型限制找设置点的时候, 甚至翻到了 fckeditor 源目录下, 可是那里的设置并没有问题. 却忽略了 ruby 一直是代码维护配置的! 其实这个插件中上传的 MIME 类型设置在本插件目录下 app/controllers/fckeditor_controller.rb 文件中.

by agate - Published: 2008-08-23 [10:52 下午] - Category: 程序编码

"will_paginate" is a rails plugin for helping developer to create the pagination links. use it, you can very easily to make a nice pagination links.

usage:
It’s very easy to do pagination on ActiveRecord models:
cattr_reader :per_page
@@per_page = 5 #modify this

It’s also very easy to make a on Controller:
@posts = Post.paginate :page => params[:page], :order => 'created_at DESC'
In the view, page links can be rendered with a single view helper:
<%= will_paginate @posts %>

Homepage: http://github.com/mislav/will_paginate/wikis
Clone URL: git://github.com/mislav/will_paginate.git
Doc URL: http://mislav.caboo.se/static/will_paginate/doc/