将路线映射到admin / news / show,另一个映射到news / show,我需要2个控制器吗?

时间:2012-11-12 16:50:03

标签: ruby-on-rails ruby-on-rails-3

其实我不明白如何正确处理这个问题。我有一种情况,可以使用admin / edit admin / show admin / news ...和类似路径管理新闻,但是我想给用户一个名为news / show / 1的页面,因为实际上我的新闻资源是在“ admin“命名空间,我应该如何处理我需要在”admin“命名空间之外绑定新闻路由的事实?

其实我只有这个:

namespace :admin do
  resources :news
end

我的想法:

namespace :admin do
  resources :news
end
resources :news

然后我会:

  • 应用程序/控制器/管理/ news_controller.rb
  • 应用程序/控制器/ news_controller.rb

这是对的吗?

2 个答案:

答案 0 :(得分:1)

看到你的回答,我可以建议更简单的路线。

#routes.rb
namespace :admin do
  resources :news
end

resources :news, :only => [:show]

如果您也想要index操作,请将最后一行重写为:

resources :news, :only => [:index, :show]

您不需要news_pathnews_url的帮助者。你会得到它们已经为你建造。

答案 1 :(得分:0)

在路线上工作了一下之后,我明白了如何构建我想要的东西:

namespace :admin do
  resources :news
end

get 'news/:id(.:format)' => 'news#show'

这是因为我不需要所有路线用于我的新闻,但只显示(我也可以添加索引,但目前不需要)。通过这种方式,我可以处理2个不同控制器上的所有内容,这样更好,因为我在新闻控制器上使用了重定向,而我在Admin :: NewsController上没有使用它。

我注意到另一个重要的事情,如果你以这种方式建立路线 news_path和news_url将不会被创建。因此,我不得不在news_helpers中以这种方式手动创建它们:

module NewsHelper
  def news_url(record)
    url_for controller: 'news', action: 'show', only_path: false, id: record.slug
  end

  def news_path(record)
    url_for controller: 'news', action: 'show', only_path: true, id: record.slug
  end
end

(slug用于seo友好的网址)然后我只是以这种方式将助手包含在我的控制器中:

class NewsController < ApplicationController
  include NewsHelper

一切都按照我的意愿运作,看起来也很棒。