Coffeescript/Zappa, как передать массив для рендеринга

Это вопрос новичка в zappa/coffeescript, я пытаюсь написать скрипт, который собирает данные из mysql и отображает результаты с помощью div, а не таблиц, пока работает только с одной строкой. Мой вопрос, как мне передать весь массив результатов для вывода с шаблоном? Пример кода ниже, любая критика приветствуется, спасибо:

@post '/', (req, res) ->    #POST FOR SHOWSTOCK
  MysqlConnection = mysql.createConnection(
    ...
  )
  MysqlConnection.connect()
  .... 
    else
      sql = "select art.artcode,art.artname, art.artsonst, groessen.colcode,groessen.artgrb,groessen.artwidth,groessen.artist,date_format(artoffdate,'%d-%m-%y') as mydate, groessen.soreason from groessen,art where groessen.artcode = art.artcode and  art.artcode = " + MysqlConnection.escape(req.body.art.artcode)
      MysqlConnection.query sql, (err, rows) ->
        throw err if err
        ... 
        exports.art = rows
        ...
  MysqlConnection.end
  @redirect '/showstock'  # 'back' or 'home'= "/"



@get '/': ->     
  @render index: {
     }


@view index: ->    
  h1 img src: '/BW_AL_Logo_Blue.jpg', align:'left', alt:'Logo' , width:240, height:120, top:25, left:370 ,position:'absolute'
  h2 style: "font-family:sans-serif;;position: absolute; top: 10px; width: 250px; left: 350px; height: 25px; background-color: white", 'XYZ Stock Information'
  form method: "post", action: "/", ->
    div "#Artcode", style: "position: absolute; top:60px; left:680px; width: 121px; height: 21px;", ->
      input type: "text", name:"art[artcode]"
    div "#Submit", style: "position: absolute; top:60px; left: 840px; width: 121px; height: 21px;", ->
      input type: "submit", value: "Submit"


@get '/showstock': ->    
  @render showstock: {
     artname0: exports.art[0].artname
     ... 
     }


@view showstock: ->    
  h1 img src: '/BW_AL_Logo_Blue.jpg', align:'left', alt:'Logo' , width:240, height:120, top:25, left:370 ,position:'absolute'
  ...
  div style: "position: absolute; left: 10px; top: 195px; height: 400px; width:1200px; padding: 2px; border:2px solid gray;",->
    div "#colcode", style: "height: 3px;width:90px;float:left;",->
      b "COLOUR"
      br()
      @colcode0
    div ...  

1 ответ

Вот как передать и использовать переменные в функции представления (с http://zappajs.org/docs/crashcourse/):

@get '/': ->
  @render index: {foo: 'bar'}

@view index: ->
  @title = 'Inline template'
  h1 @title
  p @foo

Что касается перебора строк в вашем наборе результатов, вам нужно сделать что-то вроде:

@view index: ->
  for row in @foo.rows
    div '', "#{row.itemno}: #{row.itemname}"

Точные детали зависят от того, какой движок шаблонов вы используете (из того, что вы написали, похоже на Coffeecup). Имейте в виду, что шаблоны Coffeecup на самом деле представляют собой просто код Coffeescript с множеством вспомогательных функций (названных идентично тегам HTML) и некоторыми соглашениями для визуализации "поддерева" (путем передачи функции, которая визуализирует поддерево). Поэтому для итерации по объекту данных вы просто пишете код Coffeescript, чтобы сделать это, вызывая удобный метод Coffeecup для генерации HTML-текста.

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

Если вы реорганизуете код в своей функции "showtock", чтобы она была обычной функцией-членом, передавая любые переменные запроса / ответа (я вижу, что Zappa пропускает их неявно, но я не знаю достаточно о Zappa, чтобы предоставить точные ответы) и объект строк Просто сделайте, чтобы эта функция возвращала визуализированный текст. Вызывая этот метод как из обработчика "/", так и из обработчика "/showtock", вы сможете обрабатывать различные варианты использования, не дублируя код или не пытаясь передать огромные объекты данных как объекты данных HTTP.

Другие вопросы по тегам