@Rei 嗯,基于各位的讨论,我目前的结论就是,在 rails 的 routes 实现中,并没有将路由信息存储在某个数据结构里,一切都是动态 helper 方法中生成的,因此,也就没有简单进行反查的方法。
此外,由 member 和 collection 生成的 url,仅是一种约定。换句话说,要使用 params[:id] 的方法进行判定的前提,就是所有定义的路由规则,都遵从这一约定。
这个问题的起因是做一个类似 activeAdmin 的 gem,,希望自动根据当前 action 设定某些允许的 action,比如当前是:show,则允许 [:edit,:delete],反之若是:index,,则只能允许 collection 类的 action。因此需要能自动判定 action 是 collection or member?
检查 params[:id] 是一个方法,但总感觉有一些局限性,比如/account/profile 之类。我的愿望是,既然我们在编写 route.rb 时已经明确了各类信息,为什么没有一个 api 能够访问这些信息呢?
比如,我又有一个问题,,如何判定当前的 controller 是单数 (resource) 还是复数 (resources) 资源呢?
Kohana 框架,CodeIgniter 的一个分支,,和 rails 的结构十分相仿,, 可以做为从 php 向 rails 的一个过渡,, 不过,最终还是转到 rails 吧,
@dotnil 有在 github 托管吗,,现在对做 kissy-rails.js 也很有兴趣,可以一起开发
http://github.com/nowazhu/carrierwave-upyun 链接不能访问?库还没放上去?
sinatra based, 看起来不错, http://vesperapps.com/ https://github.com/vesper/framework-gem
顺手写了一个 act_as_teaser 的 gem,感觉不是很好,主要是摘要与主体之间的同步问题,晾出来请大家指教如何改进,,,
使用方法: 在 model 中,
class Article < ActiveRecord::Base
# 假设存在:content和:teaser两数据库列,以下DSL指定使用:teaser字段保存:content的摘要,当:content更新时,自动截取生成:teaser
act_as_teaser :content,:as=>:teaser
end
模块源码
module ActAsTeaser
extend ActiveSupport::Concern
included do
include ActionView::Helpers::SanitizeHelper
include ActionView::Helpers::TextHelper
end
module ClassMethods
def act_as_teaser body, opts={}
teaser = opts[:as] || 'teaser'
length = opts[:length] || 100
self.class_eval %(
protected
def filter_teaser_#{body}
if changed.include?("#{body}") && !changed.include?("#{teaser}")
self.#{teaser} = truncate(strip_tags(self["#{body}"]),:length=>#{length})
end
end
)
self.before_save "filter_teaser_#{body}".to_sym
end
end
end
ActiveRecord::Base.send :include,ActAsTeaser
社区中似乎没有一个类似名为 act_as_teaser 的 gem,可以使用宏语句为:text 类型的字段,比如 content 字段提供一个 content_teaser 的自动截断版本,并且也允许手工 teaser,,, 是我没找到,,还是不存在? 或许应该花点时间自己写一个 :)