我想知道如何定义一个能力等级并根据已登录的用户提供该能力等级.
我正在使用Active Admin,Can Can和Devise,我已成功创建了User和AdminUser模型.
我的能力就是这个.rb
class Ability
include CanCan::Ability
def initialize(user)
user ||= User.new
if (user)
can :manage, Item
end
end
end
Run Code Online (Sandbox Code Playgroud)
现在我已经使用这个wiki条目来确定我们确实可以定义一个自定义能力文件并使用它而不是ability.rb:
https://github.com/ryanb/cancan/wiki/changing-defaults
但我想要做的是,如果登录了"非管理员用户",则能够使用ability.rb;如果登录用户管理员,则能够使用自定义能力.
问题:是否可以这样做,我不需要自定义的,我可以在一个ability.rb文件中设置权限?
我有一个模型,Domain它有一个文本字段,names.
> rails g model Domain names:text
invoke active_record
create db/migrate/20111117233221_create_domains.rb
create app/models/domain.rb
> rake db:migrate
== CreateDomains: migrating ==================================================
-- create_table(:domains)
-> 0.0015s
== CreateDomains: migrated (0.0066s) =========================================
Run Code Online (Sandbox Code Playgroud)
我将此字段序列化为模型中的数组.
# app/models/domain.rb
class Domain < ActiveRecord::Base
serialize :names, Array
end
Run Code Online (Sandbox Code Playgroud)
为此模型创建ActiveAdmin资源
> rails g active_admin:resource Domain
create app/admin/domains.rb
Run Code Online (Sandbox Code Playgroud)
然后,在app/admin/domains.rb中,我设置各种块来处理序列化字段
# app/admin/domains.rb
ActiveAdmin.register Domain do
index do
id_column
column :names do |domain|
"#{domain.names.join( ", " ) unless domain.names.nil?}"
end
default_actions
end
show do |domain|
attributes_table …Run Code Online (Sandbox Code Playgroud) 好吧,我有一个与on-to-many assoc相关的两个模型.
#models/outline.rb
class Outline < ActiveRecord::Base
has_many :documents
end
#models/document.rb
class Document < ActiveRecord::Base
belongs_to :outline
end
#admin/outlines.rb
ActiveAdmin.register Outline do
form do |f|
f.inputs "Details" do
f.input :name, :required => true
f.input :pages, :required => true
...
f.buttons
end
f.inputs "Document Versions" do
f.has_many :documents, :name => "Document Versions" do |d|
d.input :file, :as => :file
d.buttons do
d.commit_button :title => "Add new Document Version"
end
end
end
end
end
Run Code Online (Sandbox Code Playgroud)
正如您在admin/outlines.rb中看到的那样,我已经尝试在has_many:documents中设置:name,在commit_button中设置:title,但这两个选项都不起作用,我也试过:legend,: title,和:label,而不是:.has_many中的名称.不工作.
这是该代码的结果: 截图
我要显示的是"文档版本"而不是"文档","添加新文档版本"而不是"添加新文档"
如果有人能有解决方案,那就太好了
我正在尝试向Active Admin中的资源添加排序/重新排序.我了解您可以按登录时的不同列进行排序.我想要做的是能够订购商品,以便在前端按特定顺序显示.有关如何实现这一目标的任何想法?
我已经在数据库中有一个排序列.
另外,我想在管理部分中以特定顺序显示项目.
任何人对我如何实现这一点有任何想法?
我有2个型号:
我想提供2个独立的Active Admin界面.他们都有设计路线:
devise_for :users, ActiveAdmin::Devise.config
devise_for :suppliers, ActiveAdmin::Devise.config (can I somehow say ActiveAdmin2::Devise.config)
Run Code Online (Sandbox Code Playgroud)
用户可以访问产品,订单和供应商只能访问产品.
理想情况下,我想在应用程序中使用不同的文件夹并显示不同的数据.
用户/ order.rb
ActiveAdmin.register Order do
filter :email
filter :created_at , :label => "Order Creation Date"
filter :order_created
Run Code Online (Sandbox Code Playgroud)
供应商/ order.rb
ActiveAdmin.register Order do
filter :email
Run Code Online (Sandbox Code Playgroud)
有没有办法初始化2个ActiveAdmin类并并行运行它们?
还有其他更好的方法让它在同一个网站/应用程序下工作吗?
想象一下,我有以下型号:
class Translation < ActiveRecord::Base
has_many :localizations
end
class Localization < ActiveRecord::Base
belongs_to :translation
end
Run Code Online (Sandbox Code Playgroud)
如果我在ActiveAdmin中执行此操作:
ActiveAdmin.register Localization do
form do |f|
f.input :word
f.input :content
end
end
Run Code Online (Sandbox Code Playgroud)
单词关联只允许我从现有单词中进行选择.但是,我希望能够动态创建一个新单词.我认为在本地化模型中接受嵌套属性可能很有用(但是,我只能选择创建Word,而不是从现有模型中选择).我怎么解决这个问题?
当show使用Rails的ActiveAdmin宝石荷兰国际集团的资源,我想告诉另一关联模型的表.
所以,让我们说一个Winery has_many :products.现在我想显示管理资源show页面上关联的产品Winery.而且我希望这是一个类似于我index对Products资源的表格.
我让它工作,但只能通过手动重新创建HTML结构,哪种糟糕.是否有更index简洁的方法为关联资源的特定子集创建表格样式视图?
我有什么,有点糟糕:
show title: :name do |winery|
attributes_table do
row :name
row(:region) { |o| o.region.name }
rows :primary_contact, :description
end
# This is the part that sucks.
div class: 'panel' do
h3 'Products'
div class: 'attributes_table' do
table do
tr do
th 'Name'
th 'Vintage'
th 'Varietal'
end
winery.products.each do |product|
tr do
td link_to product.name, admin_product_path(product)
td product.vintage
td product.varietal.name
end …Run Code Online (Sandbox Code Playgroud) 您好我最近将更新推送到Heroku,突然之间Active Admin将不会预编译.给我这个错误.
Running: rake assets:precompile
rake aborted!
SyntaxError: cannot return a value from a constructor: "this" in class DropdownMenu
(in /tmp/build_etr05wkfpnxp/vendor/bundle/ruby/1.9.1/gems/activeadmin-0.5.1/app/assets/javascripts/active_admin/components/jquery.aa.dropdown-menu.js.cof
fee)
/tmp/build_etr05wkfpnxp/vendor/bundle/ruby/1.9.1/gems/execjs-
1.4.0/lib/execjs/external_runtime.rb:66:in `extract_result'
Run Code Online (Sandbox Code Playgroud)
不知道发生了什么或如何解决它.它在我的本地主机上工作得非常好,只有在我推送到heroku时才会发生.它之前在Heroku上也运行良好,我所做的只是添加一个模型.
有任何想法吗?
谢谢!
固定
对于大多数模型,默认排序顺序(id desc)很好.但是对于我的一个模型上的几个范围,反转顺序或者更新updated_at字段会更有意义.
我似乎无法在不破坏其他功能的情况下实现这一点,所以我希望别人可以教我如何做到这一点!
我试过在我正在返回的对象上添加.order():
scope :example do |models|
models.order('id asc')
end
Run Code Online (Sandbox Code Playgroud)
这似乎没有任何影响.
我也尝试过unscoping,哪种作品.它按照我想要的方式对对象进行排序,但它完全打破了所有过滤/搜索功能.
scope :example do |models|
models.unscoped.order('id asc')
end
Run Code Online (Sandbox Code Playgroud)
该怎么办?
我创建了一个具有单表继承的多用户,这里是我的模型
# user.rb
class User < ActiveRecord::Base
end
Run Code Online (Sandbox Code Playgroud)
这是用户模型,所有其他模型都是从数据库中的用户继承的,它们是一个模型,用于存储两种类型的用户并保存其类型
# customer.rb
class Customer < User
end
# space_owner.rb
class SpaceOwner < User
end
Run Code Online (Sandbox Code Playgroud)
**当我在活动管理栏中映射这些时,4显示错误**
Showing /home/rabnawaz/.rvm/gems/ruby-2.3.1/bundler/gems/activeadmin-0a5a15b88bff/app/views/active_admin/resource/index.html.arb where line #2 raised:
undefined method `chain' for nil:NilClass
Extracted source (around line #709):
def chain
@chain ||= begin
a = source_reflection.chain
b = through_reflection.chain
chain = a + b
chain[0] = self # Use self so we don't lose the information from :source_type
Run Code Online (Sandbox Code Playgroud)
这是我在创建活动管理员文件以显示用户时遇到的错误
你能给我一个解决方案吗?
这是我用于创建多个用户的设计路线
devise_for :admin_users, ActiveAdmin::Devise.config
ActiveAdmin.routes(self)
devise_for :customers, :controllers …Run Code Online (Sandbox Code Playgroud)