2014-05-23 3 views
1

Я хочу, чтобы иметь возможность выбрать город из существующего массива городов.Сделать выбор выбранного помощника из набора параметров?

Я хранила города в массиве в контроллере ControllerName как глобальная переменная

$cities = ["city1"...."city20"]

, и я хочу, чтобы иметь возможность получить доступ к ним через: <%= p.select(:city, $cities{ |c| [c.name, c.id]}) %>

, но затем я получаю сообщение об ошибке undefined method name for 'city1'.

Как я могу выбрать из этого существующего массива? Должен ли я сделать контроллер для городов?

Update # 1

Я пришел, чтобы сделать этот код

$cities=['city1',...'city20'] 

@city = Array.new 
i = $cities.size 

i.times do |x| 
    @city[x] = City.new 
    @city << $cities[x] 
end 

и вместо undefined method названия»для "City1": String I got неопределенный метод name' for "City20":String

PS : В таблице городов есть столбец с именем «имя», поэтому проблема не особенно там

Update # 2: Проблема решаемая

После прочтения немного в этом Rails документации я был в состоянии сделать небольшое улучшение в моем коде, и я на самом деле может решить проблема.

В моей форме, я редактировал код, который:

<%= p.select(:city, options_for_select(@cities_array))%>

И в моем ControllerName контроллер, я поставил это:

$cities.length.times do |x| 
@city = City.new({:name => $cities[x]}) 
@city.save 
    end 


@cities_array = City.all.map { |city| [city.name, city.id] } 

И это все к нему.

Если у вас есть альтернативное решение, будь то более простое или сложное, отправьте его в качестве ответа.

+0

Если «Город» - это модель, то лучше, если вы добавите свои города в качестве семян. Теперь ваш код будет добавлять в db все ваши города каждый раз, когда вы вызываете свое действие. – Aguardientico

+0

Правильно, я снова боролся ** ** найти способ установить их раз и навсегда. я могу положить их как ** семена ** –

+0

BTW: Самое простое решение (я думаю): 'p.select: city, City.pluck (: name,: id)' – Aguardientico

ответ

1

У вас есть несколько вариантов для вставки данных в вашу базу данных.

Первый. Добавить это по миграции:

rails generate migration add_cities_rows

внутри миграции вы можете добавить что-то вроде:

cities = ['city1', 'city2', 'city3'] 
cities.each {|city| City.create(name: city)} 

, то вы можете запустить: rake db:migrate

Вы можете добавить ту же логику в db/seeds.rb файле поэтому, если вы хотите восстановить свою базу данных, работающую rake db:setup, она будет делать магию.

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

<%= p.select :city, City.pluck(:name, :id) %>

Таким образом, в вашем контроллере года не needto добавить любую логику

+0

Представьте, что есть что-то, что я хочу добавить в мою базу данных каждый раз, практически каждый раз, когда я называю 'rake db: seed', данные будут переписаны в моей базе данных, как этого избежать? –

+1

Если вы хотите добавить новые данные, просто добавьте это, миграция «семенной материал» используется, когда вы хотите пополнить/восстановить свою базу данных. – Aguardientico

+0

Я добавил логику в функцию 'self.up' в' migration', и я запустил 'rake db : migrate', но он не помещает данные в мой db. Что происходит? –

0

Эта ошибка происходит потому, что «city1» является строкой, и вы вызываете Name метод на строкового объекта, который не определен.

Возможно, у вас может быть City Model определены и должны быть с колонки базы данных ** имя внутри. Так название метода будет определяться для объекта City

Здесь $ города представляет собой массив строк, который должен быть массивом объектов вместо.

Да, сделать контроллер для городов и собрать объекты массива из этого массива строк и передать, что для просмотра

+0

Можете ли вы привести пример кода, который я должен написать, чтобы создать массив ** City Objects **? Я пришел, чтобы сделать это '@city = City.new $ cities.length.times do | x | @city [x] = $ cities [x] конец' Но, похоже, это не трюк. –

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