用Paperclip上传多个附件

在Rails程序里上传文件你会用什么呢?反正我是用的paperclip,至少它支持Ruby1.9和Rails3。哪个2B再抄我的文章甚至是改我的文章天天夜里和猪爱爱白天一直吃猪粮!

这是tutorial,所以你只需要按照步骤来就能完成一个可运行的DEMO。前提是我用的ruby 1.9.2preview3和Rails 3.0.0.beta4,你可以与我不同,不过我不保证会顺利。

我要说的是Post与Asset之间has_many的association,就是一个Post有很多的Asset。如果你只想要has_one的可以直接参看paperclip的快速入门

准备工作

我们需要一个新的Rails项目weblog,然后添加一个Post

gem install paperclip
rails weblog
cd weblog
rails g scaffold post title:string body:text
rake db:migrate
rails s

好的,访问http://localhost:3000/posts,现在一个简单的blog就完成了。

READ MORE>>

Rails需要一个JSON Builder

说过要写tutorials的,我却发现自己写的东西越来越中国化了,就是很装逼却没实际价值,高手不屑一看,新手看不懂的境界。

于是,我决定以后写的詳細一点。不过在我如此混乱的文字组织下,可能就找不到重点了

我有很多的events,想返回JSON格式,只需要这样写

class EventsController < ApplicationController
  respond_to :json

  def index
    respond_with(@events)
  end
end

Rails很智能,它会自动的使用@events.to_json来返回JSON,大部分时间这就是我想要的,可现在问题出现了。。。

我不喜欢默认的这个JSON,比如我需要给这个JSON加一个值"total":69。如果是XML格式,Rails提供了Builder,可我没找到比较方便的JSON Builder

针对现在小小的需求,可以这样做
READ MORE>>

Rails中STI的RESTful routes问题

不解释,你是知道STI的——single table inheritance,我们看下问题是什么

现在有两个Model:AssetImage

class Asset < ActiveRecord::Base; end
class Image < Asset; end

我们定义了这样一个RESTful routes

resources :assets

然后在我们的AssetsController里面

class AssetsController < ApplicationController
  def create
    @asset = Asset.new params[:asset]
    @asset.save
    respond_with(@asset)
  end

  def update
    @asset.update_attributes params[:asset]
  end
end

READ MORE>>

给Rails程序添加主题切换功能

都明白是什么意思的,比如像Wordpress一样的主题切换,或者说皮肤?不管怎么个叫法,在Rails里实现这种功能是很简单的。

我最近在做Android开发,我们的团队需要一个门面吧,继续使用我自己的博客程序,它可是支持主题切换功能的哟。看我为植物人新做的一个主题

eskit theme for lifeblock

READ MORE>>

让Ruby告诉你自己的名字

今天在看论坛,无聊看到一个无聊的人在问这么一个无聊的问题--

如何得到变量名字?高手指下路
var = 1;
puts "var = #{var}"
我想puts的时候不用输入var
通过var.xxx 得到 字符串"var"

后面的人就告诉他这是不可行的,他就对Ruby失望了。。。不过,可不是Ruby不行哟,不能对Ruby失望,她可是有随时检测自身状况的本领啊

# my_name.rb
module Kernel
    undef my_name if respond_to?(:my_name)
    def my_name
        md = caller[0].match(/(.+):(\d+):/)
	file_name, line_number = md[1], md[2]
	line = `awk "#{line_number}==NR" #{file_name}`
	line.match(/(\w+)\.my_name/)[1]
    rescue
	'FUCK GFW'
    end
end

READ MORE>>

Ruby 1.9强大的编码问题

如果你用Ruby 1.9不会没有遇到过编码的问题吧,Ruby 1.9支持强大的m17n,强大到我一开始接触它都要疯掉了。。。

作为一个好屁民我决定把我的痛苦经历写一写,毕竟我还没见过这方面的中文介绍。Ruby是一种很特别的语言,Ruby 1.9更是个神奇的存在。我是用Ruby 1.9后才知道还有m17n这一说法的,看来我太寡聞了么

我遇到的错误,相信你也遇到过,除非你都用的ASCII码或者你比Ruby更怪

ActionView::Template::Error (incompatible character encodings: ASCII-8BIT and UTF-8)

伟大的革命精神是怎样的?克服一切困难,没有问题也要制造问题然后解决它。解决问题之前,先来介绍一点Ruby 1.9 encoding的处理方式。

谈到编码,自然就要讲字符串,Ruby 1.9中的字符串不是一个人,他已经被编码附体了!

一个String对象不仅包含着一般意义上的字符串,还有一个Encoding对象与它关联

irb(main):014:0> s = '中文'
=> "中文"
irb(main):015:0> s.encoding
=> #<Encoding:UTF-8>

READ MORE>>

移动化我的Blog

感觉移动化这个词好别扭啊,我用这个词的意思是让我的Blog更适合用手机等移动设备阅读,用你的Android手机或iPhone访问看一下吧。

要将一个Rails程序mobilize是很简单的,我们开始吧

Controller需要一个before_filter

把下面的代码作为before_filter加入到一个合适的Controller中,合适的标准是什么呢?我也不太清楚了,或许你可以加在ApplicationController

def detect_browser
  if params[:format].blank?
    unless session.has_key? 'mobile'
      agent = request.headers["HTTP_USER_AGENT"].downcase
      session[:mobile] = agent.match(MOBILE_BROWSERS) ? 'true' : 'false'
    end
    params[:format] = 'mobile' if 'true' == session[:mobile]
  elsif 'mobile' == params[:format]
    session[:mobile] = 'true'
  elsif 'html' == params[:format]
    session[:mobile] = 'false'
  end
end

READ MORE>>