我将我的rails应用程序移植到3.1.0(从2.3.8开始),并且正在重构。现在我有以下两页的单独模型/视图/控制器。
http://www.youhuntandfish.com/fishing/fishingstories/148-late-fall-brook-trout http://www.youhuntandfish.com/hunting/huntingstories/104-early-nine-pointer
' huntingstories '和' fishingstories '实际上是一回事,所以我想分享模特/观点/控制器。
这是问题所在。在视图中,我使用的是诸如'huntingstories_path'和'fishingstories_path'之类的帮手。我不想在整个视图中添加一堆条件来选择要使用的条件。我想做的就是写。
'stories_path'
并根据网址的'/ hunting /'或'/ fishing /'部分将一些代码映射到狩猎或捕鱼。
在路线文件中有一种简单的方法吗,或者我是否需要编写视图助手?如果我能有新的“/钓鱼/故事”和“狩猎/故事”路线,并将旧路线重定向到这些路线,那就更好了。
现在是路线。
scope 'fishing' do
resources :fishingstories
resources :fishingspots
end
scope 'hunting' do
resources :huntingstories
resources :huntingspots
end
答案 0 :(得分:1)
冒着自我推销的风险,我写了一篇blog post,详细说明了如何实现这一目标。
如果我在你的位置,我也会将fishingstories
和huntingstories
改为stories
。所以你有这样的路线:
http://www.youhuntandfish.com/fishing/stories/148-late-fall-brook-trout http://www.youhuntandfish.com/hunting/stories/104-early-nine-pointer
或者只是完全删除故事,因为它似乎是多余的。无论哪种方式,代码看起来都非常相似。在routes.rb
:
[:hunting, :fishing].each do |kind|
resources kind.to_s.pluralize.downcase.to_sym, controller: :stories, type: kind
end
在您的stories_controller.rb
:
before_filter :find_story
private
def find_story
@story = params[:type].to_s.capitalize.constantize.find(params[:id]) if params[:id]
end
最后,在application_controller.rb
:
helper_method :story_path, :story_url
[:url, :path].each do |part|
define_method("story_#{part}".to_sym) do |story, options = {}|
self.send("#{story.class.to_s.downcase}_#{part}", story, options)
end
end
然后当你输入类似story_path(@huntingstory)
的内容时,Rails会自动将其转换为huntingstory_path(@huntingstory)
,并同样转换为@fishingstory ...所以你可以使用这个神奇的故事URL助手来处理任何类型的故事。