Rails 关于 RESTful 资源的 helper 的方法?

piginzoo · 2012年03月08日 · 最后由 abitno 回复于 2012年03月18日 · 3215 次阅读

地球人都知道,rails 帮咱们生成了一堆的 resources 的方法,猪如 new_xxx_path,edit_xxx_path,可是这写个类,是怎么生成的?是哪个 module 生成的?我试图去找找源码看看,可是,找不到啊。哪位了解内幕,源源一声,给个线索。

初学 rails 的时候也是对这些方法头大,根本找不到出处。最近在看 ruby 元编程,我猜这些东西都是动态方法生成的,什么 method_missing 之类,没看过源码,瞎猜的

嗯,是啊,想深入了解一下,主要是有个需求,需要动态地决定使用某个 resource helper 方法

module ApplicationHelper
  def resort_path resort
    return ski_images_path if resort.instance_of? Ski
    return sub_resort_images_path if resort.instance_of? SubResort
    nil
  end

这种对多态关联的时候,应该会用的,我的就是这种情况。

比如图片 Image 的增删改查给 Ski 和 SubResort 两个 model 共用,那么图片在被编辑完后,返回的时候,我要决定是返回 Ski 还是 SubResort,所以,就引出这个问题。

我目前的实现,自己觉得很 ugly,所以想深入了解一下它们的生成。

建议你去看看 ruby 元编程,我最近刚粗略看完一遍,才发现 ruby 的灵活性实在是太强了,如果不掌握元编程的方法,连代码都看不懂... 我也是初学者,个人觉得可以考虑重载 method_missing 捕捉方法调用,然后分析方法名结构再分别处理。抛砖引玉,呵呵。

谢谢@alucardpj,我刚看完那本书,对你说的深有体会,这是我汇集的大侠们元编程文章http://ruby-china.org/wiki/ruby-meta,一起学习共勉吧。

/usr/local/lib/ruby/gems/1.9.1/gems/actionpack-3.2.2/lib/action_dispatch/routing/route_set.rb

# Create a url helper allowing ordered parameters to be associated # with corresponding dynamic segments, so you can do: # # foo_url(bar, baz, bang) # # Instead of: # # foo_url(:bar => bar, :baz => baz, :bang => bang) # # Also allow options hash, so you can do: # # foo_url(bar, baz, bang, :sort_by => 'baz') # def define_url_helper(route, name, kind, options) selector = url_helper_name(name, kind) hash_access_method = hash_access_name(name, kind)

@module.module_eval <<-END_EVAL, FILE, LINE + 1 remove_possible_method :#{selector} def #{selector}(*args) url_for(#{hash_access_method}(*args)) end END_EVAL helpers << selector end

楼主可以试试这个,这样写就可以很好的解决你的问题咯,resource 基本上我是很少写 xx_path 了

link_to "xx", [@record, :images]

匿名 #7 2012年03月18日

啊呀,去参加完回来,电脑启动不能。停在问号处,不能贴代码了

需要 登录 后方可回复, 如果你还没有账号请 注册新账号