2011-10-31 9 views
1

ユーザーにいくつかのデータを(後で変更できるフィールドを使用して)尋ねる方法、データベースに保存してから収集したデータの一部をすべてのdbコンテンツがページソースコードに公開されないようにするページには、すべてのデータを再ロードした後、ここでopa:フォームを介してユーザーの詳細を問い合わせてデータベースに保存する

は、完全な例ですページのソースに表示されている:

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="[email protected]/> 
    <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) 
+0

私は完全に理解していません:いつこのJSがページに表示されますか?明らかに、ページの最初のビューではありません。あなたは、(完全ではあるが最小限の)実例を投稿し、このJSコードを見るためにあなたが何をしているのかを説明することはできますか? – akoprowski

+0

@akoprowski申し訳ありません、ちょっとした改造を行い、完全な例を追加しました。データベースに追加してページをリロードした後、ソースコードにはdbのすべての値を含むjavascriptが含まれています。私はそれがis_achy()関数と関係があることを認識しました。なぜなら、それがなければ何もソースに表示されないからです。それは私が(元気に)元の投稿の方程式から抜け出したものでした。 – ee2b45bd06e7c8181aef3824ec9da3

答えて

1

私は何をについて怒っていることは電子メールがで表示されていることであるという仮定の下で実行していますよあなたが表示している他のすべてのデータと同じように、ソースも表示されます。したがって、クライアント上に終わっているのは驚くことではありません。

なぜ電子メールがクライアントに送信されますか?私は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()) 
) 

これでメールがクライアントに漏れないことがわかります。私はもっ​​と良い答えを思い付くようにしようとします...

+0

ええ、あなたは正しく仮定しました。 @ serverディレクティブが何の効果も持たない理由も不思議でした。私は回避策にスピンを与えるでしょう、おそらく私のユースケースのために十分でしょう、ありがとう。 – ee2b45bd06e7c8181aef3824ec9da3

関連する問題