只有第一个用户/管理员才能使用Devise创建用户

时间:2018-06-14 12:22:16

标签: ruby-on-rails devise ruby-on-rails-5

我正在寻找一个不涉及额外库/模块的解决方案,只有Devise。如何让管理员成为唯一可以创建新用户的人?

我有我的模型用户,由Devise创建,我包含Admin(boolean)列,默认值设置为false。之后,我用这个命令生成了设计控制器:

rails generate devise:controllers Users

但现在我不知道该怎么做......

我已经发现了一些非常相似的stackoverflow问题,但没有人回答我的问题。我试图在不生成新控制器的情况下完成此操作,仅使用上面命令生成的子类。希望你能帮帮我。

谢谢!

更新

我想做一些与此stackoverflow question的最后一个答案类似的内容,但我无法将其付诸实践:/

2 个答案:

答案 0 :(得分:0)

您应该在routes.rb中创建自定义控制器:

devise_for :users, :controllers => {:registrations => "registrations"}

https://github.com/plataformatec/devise/wiki/Tool:-Generate-and-customize-controllers Override devise registrations controller

然后,您应该运行迁移以向用户表添加管理字段:

def change
  add_column :users, :admin, :boolean, default: false
end

最后在您的控制器逻辑中,只允许管理员创建用户,例如:

if user.admin == false
  flash[:alert] = "You are not allowed to create a user"
  redirect_to whatever_path
end

我认为这应该可以胜任。

答案 1 :(得分:0)

我最后用这个问题的最后一个答案解决了我的问题(Nuclearmans):Only allow admin user to create new users in Rails with Devise (No external modules)

顺便说一下,我必须创建一个自定义控制器(// Simple object with metadata hierarchy: class MyMetadataContainer : INotifyCollectionChanged { // contains a list of metadata, caises the CollectionChanged event on add/remove }; class ObjectWithMetadata { public MetadataContainer { get { return m_MDCont; } } private MyMetadataContainer m_MDCont = new MyMetadataContainer(); // more stuff... }; // ICustomTypeDescriptor for object with metadata class ObjWMetadataDescriptor : ICustomTypeDescriptor { private List<MyPropInfo> propList = new List<MyMetadata>(); public ObjWMetadataDescriptor(ObjectWithMetadata obj) { // fills propList based off current metadata obj.MetadataContainer.CollectionChanged += MetadataCollectionChanged; } public MetadataCollectionChanged(object sender....) { // Updates the internal list of properties with the add/remove } public PropertyDescriptorCollection GetProperties(Attribute[] attributes) { // Builds a PropertyDescriptorCollection off the stored list of properties } // the rest of the ICustomTypeDescriptor interface... }; // in MyMainWindow class: private void OnContextMenuAddMetadata( ... ) { // Get the object from the TypeDescriptor from propGrid.SelectedItem // Poll the user for what Metadata to add // This updates the MetadataCollection, which sends the event to the TypeDescriptor, which updates its internal list. objWMetadata.MetadataContainer.AddMetadata(name, value); // #TODO - tell PropertyGrid to rebuild itself here somehow? myPropGrid.??? }; )。