用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就完成了。
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:Asset和Image
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
给Rails程序添加主题切换功能
让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
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>
移动化我的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
