我是Ruby和RoR的新手,我想为演示应用创建一个管理部分。
通过一些研究,我已经找到了两个不同的选项来创建管理部分。例如:
# config/routes.rb
namespace :admin do
resources :users
end
# app/controllers/admin_controller.rb
class AdminController < ApplicationController
before_filter :authorized?
...
end
这两个选项中哪一个是为管理部分定义控制器的最正确方法,或者它们都是相同的?
# app/controllers/admin/users_controller.rb
# I think this is what rails generates if I run the "rails g controller admin::users" command
class Admin::UsersController < AdminController
...
end
# or instead
module Admin
class UsersController < AdminController
....
end
end
答案 0 :(得分:2)
您还可以使用Ruby on Rails应用程序的管理框架,例如
ActiveAdmin https://github.com/activeadmin/activeadmin
OR
<强> Railsadmin 强> https://github.com/sferik/rails_admin
答案 1 :(得分:0)
两种方法都会产生相同的结果,即UsersController
,它继承自AdminController
,可在Admin
模块(命名空间)中找到。
Admin::MyClass
只是module Admin ... class MyClass
,的快捷方式,但是......
但我更喜欢显式的嵌套代码(在自己的行上有module Admin
),因为如果以前从未定义Admin
- 模块,它确实会有所不同。在使用标准轨道进行黑客攻击时,这可能不会发生,但是当您在rails之外编写ruby代码时可能会发生这种情况。
请参阅以下示例:
class I::Am::AClass
end
i = I::Am::AClass.new
puts i.inspect
将导致
i.rb:1:in `<main>': uninitialized constant I (NameError)
如果您之前从未在代码中声明I
和嵌套Am
模块。
尽管
module I
module Am
class AClass
end
end
end
i = I::Am::AClass.new
puts i.inspect
将起作用:
#<I::Am::AClass:0x00000001d79898>
因为模块是沿着AClass
的路径创建的(至少这是我的想法)。
如果您遇到过这个问题而想要保存空格(因为您通常会在module
定义中缩进内容),可以使用一些习语。以最明显的方式(对我来说)解决问题的方法如下:
# Predefine modules
module I ; module Am ; end ; end
# Just a shortcut for:
# module I
# module Am
# end
# end
class I::Am::AClass
end
i = I::Am::AClass.new
puts i.inspect
#<I::Am::AClass:0x000000024194a0>
刚刚发现问题的性质(它不是关于管理界面,更多关于模块语法)也在这里很好地讨论Ruby (and Rails) nested module syntax。我很乐意看到关于这个问题的ruby-bug报告/功能请求:)