Почему этот код ERB в приборе выдает «неопределенный метод»? - PullRequest
0 голосов
/ 25 июня 2009

Я пытаюсь использовать приборы для добавления более сложных тестовых данных, чтобы протестировать определенные сценарии с помощью внешнего интерфейса, который находится во Flex. Я не уверен, что это правильный путь с рельсами. Мое приложение rails - это карточная игра, и «более сложные тестовые данные», которые я пытаюсь проверить, представляют собой различные комбинации карт.

Например, я хочу создать тестовую игру, в которой у игрока 1 есть карты B и C, в котором я специально добавил карты B и C в руку игрока в матче.

У меня есть основные приспособления для игроков, игр и пользователей, которые были там некоторое время и работают нормально. Я попытался добавить следующий код erb в фиксторе игр, чтобы вызвать метод Game.start, и я получаю

NoMethodError: undefined method `games' for main:Object

Фрагмент кода прибора:

four:
  id: 4
  num_players: 3
  turn_num: 0
  status_id: 1

<% game_four = games(:four).find
   game_four.start
%>

Ответы [ 3 ]

5 голосов
/ 25 июня 2009
game_four = games(:four).find

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

four:
  id: 4
  num_players: 3
  turn_num: 0
  status_id: 1

<% Game.find_by_name(four).start %>

Кроме того, это не совсем подходящее место для такой команды. Светильники не предназначены для «запуска игр». Вы действительно должны переместить эту команду в другое место, возможно, в специальном тестовом примере в блоке настройки.

EDIT:

Я копирую здесь свой комментарий, опубликованный пару дней назад на оригинальный ответ со ссылкой на новую функцию заполнения базы данных Rails: http://ryandaigle.com/articles/2009/5/13/what-s-new-in-edge-rails-database-seeding

Именно это объяснил Иегуда Кац в своем ответе и определенно лучший способ решения этой проблемы.

4 голосов
/ 30 июня 2009

Вероятно, лучшее решение (и фактически то, которое теперь канонизировано по краю) - это иметь файл seed.rb в каталоге db, который вы загружаете из задачи rake.

Вот что Rails делает сейчас на грани (чтобы быть в Rails 3).

# db/seeds.rb
# This file should contain all the record creation needed to seed the database with its default values.
# The data can then be loaded with the rake db:seed (or created alongside the db with db:setup).
#
# Examples:
#   
#   cities = City.create([{ :name => 'Chicago' }, { :name => 'Copenhagen' }])
#   Major.create(:name => 'Daley', :city => cities.first)

И затем новое рейк-задание (которое вы можете добавить в свой Rakefile):

desc 'Load the seed data from db/seeds.rb'
task :seed => :environment do
  seed_file = File.join(Rails.root, 'db', 'seeds.rb')
  load(seed_file) if File.exist?(seed_file)
end

Если вы настроите свой файл seed.rb таким образом, вы будете следовать новому соглашению и сможете удалить задачу rake seed при обновлении до Rails 3.

Кроме того, миграции не для данных. Насколько я знаю, это общепризнанное и универсальное мнение основной команды Rails.

0 голосов
/ 31 июля 2009

Если вы хотите использовать метод fixtures (при загрузке данных для разработки, а не во время тестов), вы можете использовать плагин fixtures_references. Его поведение будет таким же.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...