地球人都知道,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]