1

我正在将我的 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”这样的助手。我不想在整个视图中添加一堆条件来选择使用哪个。我想做的就是写。

“故事路径”

并有一些代码将其映射到给定 URL 的“/hunting/”或“/fishing/”部分的狩猎或钓鱼。

在路由文件中是否有一种简单的方法可以做到这一点,还是我需要编写视图助手?如果我能有“/fishing/stories”和“hunting/stories”的新路线,并将旧路线重定向到这些路线,那就更好了。

这是现在的路线。

scope 'fishing' do
    resources   :fishingstories
    resources   :fishingspots
end
scope 'hunting' do
    resources   :huntingstories
    resources   :huntingspots
end
4

1 回答 1

1

冒着听起来像是自我推销的风险,我写了一篇博文,详细说明了如何实现这一目标。

如果我在你的位置,我会改变fishingstorieshuntingstoriesstories一样。所以你会有这样的路线:

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 助手用于任何类型的故事。

于 2012-12-02T16:39:10.367 回答