如何在活动管理员中显示所选用户的下拉列表?

时间:2013-06-24 11:43:25

标签: ruby-on-rails-3 activeadmin

您好我正在开发使用devise和ActiveAdmin的Rails 3.2.9应用程序。我有像用户和公司这样的模型。我希望管理员从特定公司的注册用户列表中选择一个经理。

我的用户表包含以下字段:id,username,email,company_id,password等

我公司的表有:id,company_name,manager_id(这只是用户的id),created_at等

我编写的以下代码显示了所有公司的用户。我希望只有特定公司的用户才能在点击编辑后显示在下拉列表中。

这是我的company.rb文件,用于管理员

ActiveAdmin.register Company do
  index do
    column "Company", :name
    column :address
    column "No. of Subscriptions", :no_of_licenses
    column "Manager", :manager_id
    default_actions
  end
  filter :name

  form do |f|
    f.inputs "Company Details" do
      f.input :name
      f.input :address
      f.input :no_of_licenses, :label => 'No of Subscriptions'
      #THIS LINE NEEDS TO BE CHANGED
      f.input :manager_id, :as => :select, :collection => User.joins('LEFT OUTER JOIN companies ON users.company_id = companies.id').map{|u| [u.username, u.id]} 
    end
    f.buttons
  end  
end

EDIT1:

我添加了一个控制器,并按照jeremy04的建议进行了更改。在用户模型中添加了一个方法,并从该控制器的编辑操作中调用它。我现在收到像

这样的错误
 NoMethodError in Admin::CompaniesController#edit

undefined method `[]' for nil:NilClass

Rails.root: D:/WS/som_new
Application Trace | Framework Trace | Full Trace

app/admin/companies.rb:9:in `edit'

我的companies.rb文件现在看起来像这样

ActiveAdmin.register Company do

  controller do
      # This code is evaluated within the controller class

      def edit
        puts "IN EDIT"
        #@user_with_companies=[]
        @user_with_companies = User.users_with_company(params[:company][:name]).pluck(:username)
        puts @user_with_companies
      end

    end


  index do
    some code...
  end
  filter :name


  form do |f|
    f.inputs "Company Details" do
      f.input :name
      f.input :address
      f.input :no_of_licenses, :label => 'No of Subscriptions'
      f.input :manager_id, :as => :select, :collection => @user_with_companies #.map{|u| [u.username, u.id]}

    end
    f.buttons
  end 

1 个答案:

答案 0 :(得分:0)

你几乎得到了它,我建议你在用户模型中创建SQL逻辑(创建一个传递公司名称的方法)或使用范围。

def self.users_with_company(company)
  User.joins(:company).where("companies.name = ?", company)
end

然后在控制器的编辑操作中调用新方法:

@user_with_companies = User.users_with_company(params[:company][:name])

然后:

:collection => @ user_with_companies.map ..。等。