0

所以我用范围路由和form_for遇到了这个问题:form_for和范围,rails 3

我的问题更糟,因为我不只是想限定所有方法,我希望所有方法都在“/admin”下,除了 GET/show。

所以我的 routes.rb 有这样的东西:

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

运行 rake routes 实际上确实显示了我想要的,其中两个版本的课程路径仅在方法上有所不同,PUT 与 GET。因此,其他人提供的解决方案在您执行以下操作时提供:

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

对我不起作用,因为 course_path(@lesson) 将始终返回没有 /admin 前缀的 GET 路径,这仍然会破坏我的表单。

所以我想不通的是,我可以在 rails path helper 中指定方法,以便它使用以 /admin 开头的路由吗?还是有完全不同的方法来解决这个问题?我知道我可以通过更改来消除歧义并消除歧义:

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

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

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

4

1 回答 1

0

我认为您正在寻找这种语法:

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

这将构建一个名为admin_lesson_pathif @lessonispersisted?admin_lessons_pathif it's not 的多态路由助手。助手将admin_lesson_path传递@lesson对象,因此路线将类似于admin/lessons/1. admin_lessons_path会产生/admin/lessons. 然后表单将知道是否使用POSTPUT取决于记录是否保留。

您可以像这样在您的路由文件中定义路由助手:

 namespace :admin do
   resources :lessons
 end

通过命名这个控制器,它有几个优点。其中之一是您可以将所有管理员内容放在单个命名空间后面,然后使该命名空间中的所有内容都从基本控制器继承:

 module Admin
   class LessonsController < BaseController 

   end
 end

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

通过将您所有的管理员内容放在这些命名空间控制器中,您可以将所有管理员操作保存在一个位置,并将所有面向用户的操作保存在另一个位置。如果您听说过“关注点分离”,那么这是一个很好的例子。

于 2013-01-25T02:02:47.433 回答