2015-01-18 3 views
2

Я пытаюсь реализовать выпадающее меню, которое отображает выбор имен атрибутов модели. Это также включает имена ассоциированных атрибутов модели в некотором случае.Rails 4 Выберите Dropdown для всех атрибутов модели

Я попытался использовать Model.attribute_names, но это также добавляет атрибуты id, created_at и updated_at. Связанные атрибуты также должны отображаться в удобной для пользователя форме, то есть account_id необходимо сопоставить с номером account.number.

Я пытаюсь сделать это для целого ряда моделей, и я хочу добавить все атрибуты в один раскрывающийся список. В другом учебнике указано, что Model.reflect_on_all_associations.map (&: name) возвращает все ассоциативные модели, поэтому мне было интересно, может ли цикл через них быть решением?

Любые мысли?

ответ

3

Вы можете использовать column_names:

Model.column_names # will return an array of table attributes 

EDIT

Как удалить ненужные атрибуты из списка выбора, вы можете создать константу, которая определяет все атрибуты, которые вы не хотите быть в вашем списке выбора:

REMOVE_FROM_LIST = ['created_at', 'updated_at', 'id'] 

и затем вызвать Model.column_names - REMOVE_FROM_LIST будет возвращать только нужные атрибуты.

Вы можете пойти дальше и определить метод класса, возвращая необходимый список атрибутов:

def self.desired_list_of_attributes 
    Model.column_names - REMOVE_FROM_LIST 
end 

Теперь, вызывая Model.desired_list_of_attributes возвращает список только с необходимыми атрибутами.

+0

Спасибо @ Andrey. Решение Model.column_names предоставляет все имена атрибутов для конкретной модели. Возможно, вы знаете, как удалить ненужные атрибуты, а также отобразить связанные атрибуты в одном массиве? Поскольку я использую рельсы 4, я не думаю, что access_attributes будет работать для меня ... Возможно, я ошибаюсь, так как я совершенно новый для Rails. – Herm

+0

@ Если вы можете использовать любые методы, доступные для 'Array', например,' Array # reject' - 'Model.column_names.reject {| c | c.include? 'created_at'} ' –

1

Я бы переместить это в концерн:

модель/проблемы/attr_getter.rb

module AttrGetter 
    extend ActiveSupport::Concern 
    module ClassMethods 
    def accessible_attrs 
     column_names.reject { |a| a.in? %w(id created_at updated_at) } 
    end 
    end 
end 

И тогда include это в любых моделях вам нужно.

Что касается атрибутов ассоциации, я бы просто включил их в свои представления, добавив все массивы атрибутов моделей вместе.

+0

только что открыл вопрос, потому что собирался упомянуть о проблемах, если OP нуждается в такой функциональности больше, а затем один раз. Хорошая точка зрения! –

+0

Спасибо @evanbikes. Это очень помогает! – Herm

+0

Мне просто пришлось добавить расширение ActiveSupport :: Concern во второй строке, чтобы заставить это работать. Спасибо – Herm

Смежные вопросы