活动管理员和关联

时间:2013-12-03 09:53:57

标签: ruby-on-rails associations activeadmin nested-attributes

已经有一段时间了,因为我已经使用Rails做了任何事情,现在我正在使用rails 4.此外,我正在看看活跃的管理员。寻找一些帮助让我继续前进。

我有两种模式:

class Membership < ActiveRecord::Base
  belongs_to :member
  attr_accessible :membership_type
end

class Member < ActiveRecord::Base
  has_many :memberships

  accepts_nested_attributes_for :memberships
  attr_accessible :forename, :middlename, :surname, :house_no, :house_name, :street,   :town, :postcode, :home_tel, :mobile_tel, :work_tel, :email, :membership_attributes
end

她的想法是,在创建新成员时,您应该能够从下拉列表中选择成员资格类型(有3个选项)

我的主动管理资源目前看起来像这样但我需要合并新的会员类型:

ActiveAdmin.register Member do
  # Set Which Columns are to be displayed on the index page
  index do
    column :forename
    column :middlename
    column :surname
    column :house_no
    column :house_name
    column :street
    column :town
    column :postcode
    column :home_tel
    column :mobile_tel
    column :work_tel
    column :email
    default_actions
  end

  # Set Which Columns are to be displayed on Create New Member
  form do |f|
    f.inputs "Member Registration" do
    f.input :forename
    f.input :middlename
    f.input :surname
    f.input :house_no
    f.input :house_name
    f.input :street
    f.input :town
    f.input :postcode
    f.input :home_tel
    f.input :mobile_tel
    f.input :work_tel
    f.input :email
    f.input :memberships, :label => 'Membership Type', :as => :select, :collection => Membership.all
  end   
end

因此我的会员资格选择框出现在表单中,但显示为:

#<Membership:123456> 

如何让它显示实际值?

稍微偏离问题主题但是使用rails 4我不再需要使用attr_accessible我,但是现在我已经包含了gem'en protected_attributes'。关于这一点的任何指示将不胜感激。

5 个答案:

答案 0 :(得分:2)

要在列视图中显示成员资格,您可以执行以下操作:

column :memberships do |member| 
  member.memberships.map { |ms| ms.type }.join(', ')
end

在Rails 4中,您可以将此代码放在Active Admin初始化程序(active_admin.rb)中而不是使用'protected_attributes'gem:

ActiveAdmin::ResourceController.class_eval do
# Allow ActiveAdmin admins to freely mass-assign when using strong_parameters
  [(params[resource_request_name] || params[resource_instance_name]).try(:permit!) || {}]
  end
end

答案 1 :(得分:2)

要显示实际成员资格类型的值,请使用此

f.input :memberships, :label => 'Membership Type', :member_label => :membership_type

Formtastic documentation有更多例子。

答案 2 :(得分:1)

嘿,看起来每件事情都很好,attr_accessible中有一个小错字:

:membership_attributes -> :memberships_attributes

如果可能的话,把它放在第一位,

attr_accessible :memberships_attributes, :forename, :middlename, :surname, :house_no, :house_name, :street,   :town, :postcode, :home_tel, :mobile_tel, :work_tel, :email

要允许嵌套和更新has_many关联,您必须将以下内容添加到它们所属的模型中:

  1. 为嵌套属性添加attr_accessible以允许批量分配。

  2. 如果belongs_to模型被销毁,则添加明显的has_many关联以及销毁相关has_many关联的选项。

  3. 添加accepts_nested_attributes以允许单个请求更新has_many模型和belongs_to模型,并选择在需要时销毁has_many模型。

答案 3 :(得分:1)

如果您使用的是Rails 4并且刚刚开始使用ActiveAdmin,我建议您使用master分支中的版本。 ActiveAdmin&lt; 1.0.0-pre不支持Rails 4,实际上通过permit_params dsl支持强参数。

要使用该版本,请将以下内容添加到Gemfile

gem 'activeadmin', github: 'gregbell/active_admin'

在Rails 4中,您不再使用attr_accessible,并且需要在控制器中允许所有参数。有关详细信息,请查看此处的文档:

https://github.com/gregbell/active_admin/blob/master/docs/2-resource-customization.md

ActiveAdmin.register Member do
  permit_params :forename, :middlename, :surname, :house_no, :house_name, :street, :town, :postcode, :home_tel, :mobile_tel, :work_tel, :email, membership_ids
end

至于您的会员资格无法正常显示,ActiveAdmin会在智能查询中尝试确定某些内容的显示名称,尝试使用名为nametitledisplay_name的方法,如果所有其他方法都失败,to_label,to_s , and, I think,检查`。只需在您的会员模型中添加方法:

def display_name
  membership_type
end

答案 4 :(得分:0)

您可以通过以下方式执行此操作:

f.input :memberships, :label => 'Membership Type', :as => :select,:collection => proc {(Membership.all).map{|m| [t.membership.name,t.id]}}