给定URL的内容覆盖rails route / path?

时间:2012-12-02 14:27:44

标签: ruby-on-rails

我将我的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

1 个答案:

答案 0 :(得分:1)

冒着自我推销的风险,我写了一篇blog post,详细说明了如何实现这一目标。

如果我在你的位置,我也会将fishingstorieshuntingstories改为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助手来处理任何类型的故事。