2013-03-11 2 views
0

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

puts home_team 

Я получаю все домашние команды вернулись

get_match.rb #grabbing данные

require 'open-uri' 
require 'nokogiri' 

module MatchGrabber::GetMatch 

FIXTURE_URL = "http://www.bbc.co.uk/sport/football/premier-league/fixtures" 

def get_fixtures 
doc = Nokogiri::HTML(open(FIXTURE_URL)) 
home_team = doc.css(".team-home.teams").text 
end 
end 

Тогда я хочу обновить моя модель

match_fixtures.rb

module MatchFixtures 
class MatchFixtures 
include MatchGrabber::GetMatch 

def perform 
    update_fixtures 
end 

private 

def update_fixtures 
    Fixture.destroy_all 
    fixtures = get_fixtures 
end 

def update_db(matches) 
    matches.each do |match| 
    fixture = Fixture.new(
     home_team: match.first 
    ) 
    fixture.save 
end 
end 
end 
end 

Итак, следующий шаг - это то, где я застреваю. Прежде всего, мне нужно передать результаты home_team в массив?

Вторая часть - это передача совпадений через мой метод update_db, но это неправильно, что я могу здесь передать, результаты home_team из моего метода update_fixtures или самого метода?

Для выполнения этой задачи я делаю:

namespace :grab do 
task :fixtures => :environment do 
MatchFixtures::MatchFixtures.new.perform 
end 
end 

Но ничего сохраняется, но это и следовало ожидать.

Крутая кривая обучения здесь и была бы оценена толчком в правильном направлении.

ответ

1

Вызов css(".team-home.teams").text не возвращает элементы согласования DOM в качестве массив, но как одна строка.

Для того, чтобы получить массив элементов, рефакторинг ПОЛУЧИТЬ приспособление во что-то вроде этого:

get_teams 
    doc = Nokogiri::HTML(open(FIXTURE_URL)) 
    doc.css(".team-home.teams").map { |el| el.text.strip } 
end 

Это возвращает массив, содержащий текст элементов, удовлетворяющие заданным критериям выбора, раздели из пустой и новой строки персонажи. На этом этапе вы можете перебираете возвращенный массив и передать каждую команду в качестве аргумента create метода вашей модели:

get_teams.each { |team| Fixture.create(home_team: team) } 
+0

спасибо, что убрал еще кое-что для меня, хотя он, кажется, снимает первую букву только для каждой домашней команды, теперь она отправляется в db, что здорово, но теперь нужно получить целое слово, а не просто первое письмо – Richlewis

+0

ok, поэтому я использовал .split ('') вместо полосы, теперь проблема только в том, что когда есть команда под названием West Ham, например, я получаю только West – Richlewis

+0

String # strip " возвращает копию строки с удалением ведущего и конечного пробелов ". http://www.ruby-doc.org/core-1.9.3/String.html#method-i-strip –

1

Вы можете просто передать массив непосредственно к методу обновления:

def update_fixtures 
    Fixture.destroy_all 
    update_db(get_fixtures) 
end 

def update_db(matches) 
    matches.each {|match| Fixture.create(home_team: match.first) } 
end 

Или покончить с методом все вместе:

def update_fixtures 
    Fixture.destroy_all 
    get_fixtures.each {|match| Fixture.create(home_team: match.first) } 
end 
+0

теперь я получаю неопределенный метод .each, это будет, потому что моя columnn в модели установлена ​​на строку и im вытаскивая данные как текст. результаты не опускаются как массив? Спасибо за помощь. – Richlewis

+0

Это потому, что я думал, что get_fixtures возвращает массив. Что он возвращает? –

+0

жаль, что это было частью моего вопроса, как преобразовать результаты home_team в массив. Если я сделаю puts, я получу это, например, Chelsea Man utd Liverpool Bolton, в вертикальном списке, никакие запятые не разделяют их только один под друг друга. извините, если это не поможет – Richlewis

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