Как написать начальный и конечный теги Rails Builder XML без 'do'
У меня есть модель штаба следующим образом (для краткости)
id
firstname
lastname
stafftype (e.g. Chef, Driver, Team Leader)
У меня также есть модель StaffTimePeriod следующим образом
id
staffid
date
staffstatus (e.g. Working, Holiday, Sick)
Для каждого сотрудника существует запись StaffTimePeriod для каждого дня.
У меня есть правильная настройка ассоциаций, которая позволяет мне сделать следующее:
@stps = StaffTimePeriod.includes(:staff).where('date >= ? and date <= ?',begofweek,endofweek).order('staff.firstname,staff.lastname,date')
Таким образом, теперь я получаю все свои StaffTimePeriods для конкретной недели, отсортированные по имени и дате персонала.
Мне нужно создать XML-файл для конкретной недели с указанием имени персонала, даты, штатного расписания в следующем формате.
<rows>
<row>
<cell>firstname+lastname</cell>
<cell>stafftype</cell>
<cell>date (for Monday )</cell>
<cell>staffstatus (for Monday)</cell>
<cell>date (for Tue )</cell>
<cell>staffstatus (for Tue )</cell>
<cell>date (for Wed)</cell>
<cell>staffstatus (for Wed)</cell>
<cell>date (for Thu )</cell>
<cell>staffstatus (for Thu)</cell>
<cell>date (for Fri)</cell>
<cell>staffstatus (for Fri)</cell>
<cell>date (for Sat)</cell>
<cell>staffstatus (for Sat)</cell>
<cell>date (for Sun)</cell>
<cell>staffstatus (for Sun)</cell>
</row>
<row>
<cell>firstname+lastname (Next Staff)</cell>
....
....
</row>
</rows>
В Builder я пытаюсь перебрать @stps, НО выводить только Staff.firstname+ фамилия и Staff.stafftype при изменении Staff.id
Вот мой код Builder:
xml.instruct! :xml, :version => "1.0"
xml.tag!("rows") do
tmpstaffid = nil
weekdays = ['Mon','Tue','Wed','Thu','Fri','Sat','Sun']
@stps.each do |stp|
if tmpstaffid != nil && tmpstaffid != stp.staff.id
xml.tag!("/row")
end
if tmpstaffid != stp.staff.id
xml.tag!("row", {"id" => stp.staff.id})
xml.tag!("cell", stp.staff.fullname)
xml.tag!("cell", stp.staff.stafftype)
tmpstaffid = stp.staff.id
end
if weekdays.include?(stp.stpdate.strftime('%a'))
xml.tag!("cell", stp.stpstatus)
else
xml.tag!('cell','')
end
end
end
Однако это дает мне следующий вывод:
<rows>
<row id="4"/>
<cell>Fname4 Lname4</cell>
<cell>4</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
<cell>79</cell>
</row/>
<row id="5" />
.....
</row/>
</rows>
Как вы можете увидеть начало '<row>'
также имеет завершающий />
включен.
Мне нужен тег XML, который говорит, что это тег Starting XML, а также тег Ending XML, который можно создавать независимо, а не внутри do ... end
петля.
Могу ли я определить отдельные начальные и конечные теги XML независимо от цикла do do? Если нет, то как мне достичь вышеуказанного?