基本的にいくつかのフォームデータを$.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))))