2013-01-24 32 views
0

所以我就遇到了这个问题范围的路线和的form_for:form_for and scopes, rails 3我如何重写Rail Route Helper中的方法(PUT vs GET)?

我的问题更糟糕的是,虽然因为我不只想范围内的所有方法,我想大家是在除了GET“/管理员” /节目。

所以我的routes.rb有这样的事情:

scope '/admin' do 
    resources 'lessons', except: [:show] 
end 
get "lessons/:id" => "lessons#show", :as => "lesson" 

运行rake路线事实上确实表现出我想要的东西,其中lesson_path的只是方法不同的两个版本,PUT VS GET。因此,解决办法他人提供,你做这样的事情:

url = @lesson.persisted? ? lesson_path(@lesson) : lessons_path 
form_for @lesson, url: url do 

对我不起作用,因为lesson_path(@lesson)将始终返回不具有仍打破了/管理前缀GET路径我形成。

所以我不明白的是,我可以在rails路径助手中指定方法,以便它将使用以/ admin开头的路径吗?还是有一种完全不同的方式来解决这个问题?我知道我可以山洞,只是通过改变歧义:

get "lessons/:id" => "lessons#show", :as => "lesson" 

get "lessons/:id" => "lessons#show", :as => "show_lesson" 

但在这一点上,我只是想知道,如果它是可能的,如果是的话什么是“正确的”办法。

+0

顺便说一句,我目前通过简单的前缀,我用“/管理员”这绝对是一个糟糕的解决办法手动生成的PUT案件的网址有这方面的工作。 – eagspoo

回答

0

我认为你正在寻找这样的语法:

<%= form_for [:admin, @lesson] do |f| %> 
    # form goes here 
<% end %> 

这将构建称为admin_lesson_path如果@lessonpersisted?,或admin_lessons_path多态性路线助手,如果它不是。该admin_lesson_path助手将通过@lesson对象,这样的路线将像admin/lessons/1admin_lessons_path将生成/admin/lessons。然后,表格将根据记录是否被保留而知道是否使用POSTPUT

您可以定义你的路由信息​​的helpe文件是这样的:

namespace :admin do 
    resources :lessons 
end 

通过这个命名空间控制器,它有几个优点。其中之一是,你可以把你的所有管理-Y的东西一个单一命名空间的后面,然后从基本控制器使一切事情,从命名空间继承:

module Admin 
    class LessonsController < BaseController 

    end 
end 

然后BaseController将包含逻辑(作为before_filter)用于限制用户是否可以在该控制器中执行动作。

把你的所有管理-Y的东西,这些命名空间控制器内部,你会保持在一个地方所有的管理行为,而在另一所有面向用户的操作。如果你听说过“关注点分离”,那么这是一个很好的例子。