0

Прошло некоторое время с тех пор, как я сделал что-то с Rails, и теперь я использую рельсы 4. Также я смотрю на активного администратора. Ищете небольшую помощь, чтобы получить меня на моем пути.Active Admin and Associations

У меня есть две модели:

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> 

Как его получить, чтобы показать фактическое значение?

Также немного от вопроса, но с рельсами 4 Мне больше не нужно использовать attr_accessible, но на данный момент я включил драгоценный камень «protected_attributes». Любые указатели на это были бы оценены.

ответ

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. Добавить очевидную ассоциацию has_many с возможностью уничтожения связанных ассоциаций has_many, если модель belongs_to уничтожена.

  3. Добавьте accepts_nested_attributes, чтобы разрешить один запрос обновить модель has_many/s и модель belongs_to с возможностью уничтожить модель has_many по запросу.

+0

привет @PravinMishra, спасибо за совет, почему это это множественное число, хотя? как в членстве? также любая идея о том, как получить значение, отображаемое в представлении столбцов, добавлен столбец ive: членства, но он просто показывает текст «Членство». его как значение не было передано через – Richlewis

+0

Член @Richlewis имеет много членства, поэтому ваш код будет иметь доступ к атрибутам членства, а не атрибутам членства. Модель участника будет иметь отношение только к членству :) –

+0

Я отредактировал ответ для получения более подробной информации –

2

Чтобы показать членство в виде колонок вы можете сделать что-то вроде этого:

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

В Rails 4 вместо того, чтобы использовать камень «protected_attributes» вы можете поместить этот код в активном администратора инициализаторе (active_admin .rb):

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 
+0

спасибо, хотя кажется, что я не создаю свой член правильно, я понимаю, что вы делаете в ответ, но когда я создаю член, (Member_type] []: Студент, бит здесь потерян – Richlewis

+0

Это звучит так, как будто вы на самом деле хотите иметь отношения от 1 до 1 между Членом и Членством. Это потребовало бы объявления ассоциации в Member как has_one: membership.But, если это так, и членство имеет только поле member_type, вам действительно нужна ассоциация? Возможно, вы могли бы просто добавить поле member_type в модель Member? – user2996577

+0

ну есть 3 member_types, и да, у члена может быть только один из них, так лучше от 1 до 1? – Richlewis

1

Если вы используете Rails 4, и только начиная с ActiveAdmin, я бы рекомендовал использовать версию от основной ветви. ActiveAdmin < 1.0.0-pre не поддерживает Rails 4 и фактически поддерживает сильные параметры через dsl permit_params.

Чтобы использовать эту версию, добавьте следующую строку в ваш Gemfile

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

В Rails 4, вы не будете использовать attr_accessible больше, и весь ваш PARAMS должен быть разрешен в контроллере. Проверьте документы здесь для подробностей:

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 делает на смарт-поиска, чтобы попытаться определить имя для чего-то, пытается метод с именем name, title, display_name, to_label, to_s , and, I think, проверить, если все остальное не выполнено. Просто добавьте метод к вашей модели членства:

def display_name 
    membership_type 
end 
2

Чтобы показать значение фактического типа используют членство в этом

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

Formtastic documentation имеет больше примеров.

0

Вы можете сделать это:

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