опа: запросить данные пользователя через форму и сохранить его в базе данных - PullRequest
1 голос
/ 31 октября 2011

Как я могу попросить пользователей некоторые данные (с некоторыми полями, которые впоследствии могут быть изменены), сохранить их в базе данных, а затем показать некоторые из собранных данных пользователям сайта, чтобы все содержимое БД не отображалосьисходный код страницы?

Вот полный пример, после перезагрузки страницы все данные видны в источнике страницы:

import stdlib.crypto

type user= {md5sum: string; name: string; email: string; is_achy: bool }
db /users : stringmap(user);
db /users[_]/is_achy = {false}

setup_page()=
(
  <div id=#users>
    <div class="container">
    <table id=#lista >
    <tr>
      <th>Name</th>      
      <th>Headache?</th>      
    </tr>
    {list_db()}    
    </table>
    </div>
  </div>
  <div class="container">
    <p>
    Not on the list? Add it here.
    </p>
    <p>
    <input id=#username value="default"/>
    <input id=#email_address value="default@def.ault/>
    <input type="button" value="Add" onclick={_ -> add_user()} />
    </p>
  </div>
)

list_db()=
(  
  List.map(
    users -> <tr> <th>{users.name}</th> <th><input type="checkbox" id=#{users.md5sum} onclick={_ -> is_achy(users.md5sum)}/></th></tr>, StringMap.To.val_list(/users)
  )
)

add_user() =
(
  name = Dom.get_value(#username)
  md5sum = Crypto.Hash.md5(name)
  email = Dom.get_value(#email_address)  
  if name != "" then 
    do /users[md5sum] <- {~md5sum ~name ~email is_achy=false}
  Dom.transform([{Dom.select_body()} <- setup_page()])
)

is_achy(md5sum) =
(
  /users[md5sum]/is_achy <- Dom.is_checked(Dom.select_id(md5sum))

)

server = one_page_server("Achy head?", setup_page)

1 Ответ

1 голос
/ 01 ноября 2011

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

Почему письма отправляются клиенту?Я думал, что пометка функции list_db на стороне сервера решит эту проблему, но это не так, и, честно говоря, я не уверен, почему.Мне придется больше копать или пытаться спросить кого-то лучше информированного, чем я.Простой (хотя и не очень удовлетворительный) обходной путь заключается в создании функции, которая проецирует тип user во что-то, что необходимо для рендеринга в браузере, и создании этого проецирования на сервере.Это может выглядеть примерно так:

@server users_data() =
(
  StringMap.map(user -> {md5sum=user.md5sum; name=user.name; is_achy=user.is_achy}, /users)
  |> StringMap.To.val_list
)

list_db()=
(
  render_user(user) =
    <tr>
      <th>{user.name}</th>
      <th><input type="checkbox" id=#{user.md5sum} onclick={_ -> is_achy(user.md5sum)}/></th>
    </tr>
  List.map(render_user, users_data())
)

Вы увидите, что теперь электронные письма не «просачиваются» в клиента.Я постараюсь придумать лучший ответ ...

...