2013-10-13 1 views
2

Я создаю код рельсов, который мог бы добавить/удалить поле модели.Рельсы: используйте перезагрузку! в контроллере

Я модельную Inventory, где я мог бы добавить список полей, как показано ниже:

def update_new_fields 
    @fieldnames = params["fieldnames"] 

    @fieldnames.each do |fieldname| 
    ActiveRecord::Migration.add_column(Inventory, fieldname, :string) 
    end  
end 

Чтобы просмотреть список измененных полей

def index 
    reload! 
    @fields=Inventory.attribute_names 
    respond_to do |format| 
    format.html 
    end 
end 

Однако, у меня есть следующие ошибка:

undefined method `reload!' for #<InventoriesController:0x007fccf70b7720> 

Если бы я сделал перезагрузку! в консоли:

2.0.0 :163 > ActiveRecord::Migration.remove_column(Inventory, "f", :string) 
-- remove_column(Inventory(id: integer, name: string, description: string, quatity: integer, created_at: datetime, updated_at: datetime, a: string, b: string, c: string, e: string, f: string), "f", :string) 
    (122.9ms) ALTER TABLE `inventories` DROP `f` 
    -> 0.1232s 
=> nil 
2.0.0 :164 > Inventory.reset_column_information 
=> nil 
2.0.0 :165 > Inventory.attribute_names 
=> ["id", "name", "description", "quatity", "created_at", "updated_at", "a", "b", "c", "e", "f"] 
2.0.0 :166 > reload! 
Reloading... 
=> true 
2.0.0 :167 > Inventory.attribute_names 
=> ["id", "name", "description", "quatity", "created_at", "updated_at", "a", "b", "c", "e"] 

Это работает.

UPD

Что я узнать, есть, после того, как Фоинг в "Inventory.reset_column_information", то attribute_names были не обновляется, но информация Класс:

2.0.0 :090 > Inventory.reset_column_information 
=> nil 
2.0.0 :091 > Inventory.attribute_names 
=> ["id", "name", "description", "quatity", "created_at", "updated_at", "hello", "next"] 
2.0.0 :092 > Inventory 
=> Inventory(id: integer, name: string, description: string, quatity: integer, created_at: datetime, updated_at: datetime, a: string, b: string, c: string, d: string) 

Итак, работа вокруг я сделал это:

def index 
    Inventory.reset_column_information 
    tmp = Inventory.new 
    @fields=tmp.attribute_names 
    respond_to do |format| 
    format.html 
    end 
end 

И, наконец, мое поле в инвентаре обновляется.

+0

Здесь будут драконы ... – spickermann

+0

Некоторые, когда я это сделал, он работает. 'Индекс четкости Inventory.reset_column_information TMP = Inventory.new @ полей = tmp.attribute_names respond_to делать | формат | format.html end end' –

ответ

2

Хотя я удивляюсь, зачем вам это нужно, выглядит очень странно. Но на самом деле вы хотите обновить информацию о столбцах модели. Это можно сделать так:

Inventory.reset_column_information 

UPD

Вероятно, это потому, что класс в кэше. Вы можете перезагрузить один класс с помощью load

load "#{Rails.root}/app/models/inventory.rb" 

Хотя это будет выплюнуть некоторое предупреждение о пересмотре. Вы можете использовать метод remove_const, прежде чем загружать его снова, чтобы избежать предупреждений.

remove_const "Inventory" 
load "#{Rails.root}/app/models/inventory.rb" 

Но учтите, что делать это может привести к ошибкам в производственной среде. Если вы используете несколько экземпляров рельсов, этот код перезагрузит класс только одним! Так что подумайте дважды, может быть, есть альтернативы, как достичь того, что вы на самом деле делаете. Я настоятельно не рекомендую идти по этому пути.

+0

Если вы посмотрите на нижнюю часть моего сообщения, это именно то, что я сделал. Но у меня все равно будет поле «f» с Inventory.reset_column_information. –

+0

Прости, пропустил это. Проверьте мое обновление. –

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

  • Нет связанных вопросов^_^