我正在寻找一个不涉及额外库/模块的解决方案,只有Devise。如何让管理员成为唯一可以创建新用户的人?
我有我的模型用户,由Devise创建,我包含Admin(boolean)列,默认值设置为false。之后,我用这个命令生成了设计控制器:
rails generate devise:controllers Users
但现在我不知道该怎么做......
我已经发现了一些非常相似的stackoverflow问题,但没有人回答我的问题。我试图在不生成新控制器的情况下完成此操作,仅使用上面命令生成的子类。希望你能帮帮我。
谢谢!
更新
我想做一些与此stackoverflow question的最后一个答案类似的内容,但我无法将其付诸实践:/
答案 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.???
};
)。