Rails - 创建管理部分(`module`或`Admin ::`)的正确方法?

时间:2016-09-20 07:37:54

标签: ruby-on-rails ruby

我是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

2 个答案:

答案 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报告/功能请求:)