无法弄清楚Rails路由助手应该如何看待

时间:2013-03-08 16:54:51

标签: ruby-on-rails routes

我正在进行一项任务,其中包括向Typo添加一项功能。

rake routes显示:

admin_content    /admin/content                     {:controller=>"admin/content", :action=>"index"}
                 /admin/content(/:action(/:id))     {:action=>nil, :id=>nil, :controller=>"admin/content"}

我需要创建一个匹配以下RESTful路由的路由助手:/admin/content/edit/:id,url的示例是/admin/content/edit/1

但我无法弄明白该怎么做。我试过像admin_content_path(edit,some_article)这样的东西,但它不起作用。 (some_article只是一篇文章对象)

routes.rb档案中:

# some other code

# Admin/XController
%w{advanced cache categories comments content profiles feedback general pages
 resources sidebar textfilters themes trackbacks users settings tags redirects seo post_types }.each do |i|
match "/admin/#{i}", :to => "admin/#{i}#index", :format => false
match "/admin/#{i}(/:action(/:id))", :to => "admin/#{i}", :action => nil, :id => nil, :format => false
end

#some other code

非常感谢你的帮助!

1 个答案:

答案 0 :(得分:1)

如果您正在使用RESTful路由,为什么不使用Rails默认路由?

所以你的routes.rb看起来像是

namespace :admin do
  resources :content
  resources :advanced
  resources :categories
  resources :comments
  ...
  <etc>
end

这确实假设您的所有控制器都在admin文件夹中(但是从您的评论中可以看出这种情况。

如果你这样做,你可以使用标准的路由助手:edit_admin_content_path

如果您想手动执行此操作,则应尝试为路线添加名称。例如。如下:

match "/admin/#{i}/:action(/:id)" => "admin/#{i}", :as => "admin_#{i}_with_action"

然后你应该做像

这样的事情
admin_content_with_action(:action => 'edit', :id => whatevvvva)

作为旁注:我真的不喜欢你config/routes.rb中的元编程,如果你真的发现默认资源不合适,我会建议使用方法代替(正如解释here

例如,在你的config/routes.rb中你会写:

def add_my_resource(resource_name)
  match "/#{resource_name}", :to => "#{resource_name}#index", :format => false
  match "/#{resource_name}(/:action(/:id))", :to => "#{resource_name}", :as => 'admin_#{resource_name}_with_action", :action => nil, :id => nil, :format => false
end

namespace :admin do
  add_my_resource :content
  add_my_resource :advanced
  add_my_resource :categories
  ...
end  

哪个imho 更具可读性。

但我的建议,除非你真的需要避免它,否则将使用标准resources,因为你似乎没有添加任何特别的东西。

HTH。