2017-09-04 10 views
1

私はYesodで私の最初のアプリケーションを開発しています。私はいくつかのCRUD APIを作成しています。Yesod - 外部キーを持つフォーム

私は

userIdが外部キーである
User json 
    ... 

Activity json 
    userId UserId 
    ... 

のように見えるモデルを持っています。

新しいアクティビティを作成できるようにエンドポイントを作成する必要があり、クライアントはuserIdを指定できる必要があります。私はそう

postCreateActivityR :: Hadler Value 
postCreateActivityR = do 
    activity <- runInputPost $ Activity 
     <$> ... 
     <*> ireq textField "userId" 
    ... 

のような形式を使用しています。これを行うために

私は、次のようなエラーが表示されます。

Couldn't match type ‘Text’ with ‘Key User’ expected type: FormInput (HandlerT App IO) (Key User) 

は、この問題を解決するための標準的な方法はありますか?

+0

ようにそれを使用していた私にはありませんyesodから何かを知っているが、私はhttp://hackage.haskell.org/package/yesod-form-1.4.15/docs/Yesod-Form-Fields.html#gの 'optionsPersistKey'のようなもので私のチャンスを試すだろう: 4 –

答えて

1

が、これは私が最後

でそれを解決する方法である私は

userIdField :: (Monad m, RenderMessage (HandlerSite m) FormMessage) => Field m UserId 
userIdField = Field 
    { fieldParse = parseHelper $ \s -> 
     case signed decimal s of 
      Right (a, "") -> Right $ toSqlKey a 
      _ -> Left $ MsgInvalidInteger s 
    , fieldView = \_ _ _ _ _ -> "" 
    , fieldEnctype = UrlEncoded 
    } 

を新しいフィールドを作成し、

<*> ireq userIdField "userId" 
1

SQLバックエンドを使用している場合は、Database.Persist.SqlモジュールにtoSqlKeyがあります。 Textが与えられているので、まずに変換してData.Text.Readを使用する必要があります。レコードの場合

関連する問題