1

基本的にいくつかのフォームデータを$.ajax()するためにAngularJSリソースを使用しています。

Post.put({user:$scope.getLoggedInUser(), action:"new"},{body:$scope.postBody, "public":$scope.postPublic}, function(post) {

フォームには「public」という名前のチェックボックスがあります。

この関数を使用して、フォームデータをURLのパラメーターとマージしています。

(defn get-params [request]
  (merge (:params request) (parse-string (slurp (request :body)) true)))

ルートのハンドラーからprintlnを実行するとtrue、チェックボックスがオンになっていると便利になります。

(println (:public (get-params request)))

ただし、データベースと通信するコントローラー内の別の関数にパラメーター(つまり、printlnではない)を渡すと、その関数の先頭で別のprintlnを実行し、nil代わりに取得します。

私はそれを次のように渡してみました

(read-string x)
(boolean (Boolean/valueOf x))
(Boolean/valueOf x)

無駄に。

それを引き起こしている可能性のあるものの1つ(しかし、理由はわかりません)は、次のような認証によってリクエストをラップしていることです。

(auth? request #(create x y z))

ここで、(create)関数はデータベースにレコードを作成します。

true何を試してもなかなか取れません。

編集:より完全なコード

コントローラ

(defn auth? [request callback-true & [callback-false]]
  (println (callback-true))
  (let [login-response (auth/login request)]
    (if (and (not (string? login-response))
             login-response)
      (callback-true)
      (if callback-false 
        (callback-false)
        (json-response (str "{\"auth\":" login-response "}"), 401)))))

(defn create [user logged-in-user body public?]
  (if (= logged-in-user user)
    (json-response (post-view/single-post (post/create user body public?)))
    (json-response "{\"auth\":\"can't create post under different logged in user\"}" 401)))

(defroutes routes
  ....
  (PUT "/api/:user/new" request
       (println request)
       (auth? request
              #(create (:user (request :params))
                       (:user (request :session))
                       (:body (get-params request))
                       (:public (get-params request)))))
  ....
)

モデル

(defn create [username body public?]
  (println public?)
  (when-not (and 
              (str/blank? body)
              (str/blank? username))
  (let [user-id (:id (get-id-from-username username))
        new-post-id
        (:id 
            (sql/with-connection db
                (sql/insert-values :post
              [:usr_id :body :public] [user-id body (Boolean/valueOf public?)])))]
    (by-id new-post-id))))
4

1 に答える 1

0

二度電話しないでくださいget-params。(request :body) は、2 回読み取ることができないストリームを返します。

于 2013-02-18T00:52:16.077 に答える