0

我尝试关注 Michael Snoyman 的截屏视频http://vimeo.com/39646807。但是,似乎对 i18n 的更改会导致该代码失败。我在搭建的站点上找不到任何有关如何解决此问题的信息,而且我无法完全理解http://www.yesodweb.com/book/internationalization此处提供的信息。

这是我得到的错误,指的是 Home.hs 中的代码:

No instance for (RenderMessage master0 FormMessage)
  arising from a use of `generateFormPost'
Possible fix:
  add an instance declaration for (RenderMessage master0 FormMessage)
In a stmt of a 'do' block:
  (formWidget, enctype) <- generateFormPost noteForm
In the expression:
  do { (formWidget, enctype) <- generateFormPost noteForm;
       defaultLayout ($(widgetFile "notes")) }
In an equation for `getNotesR':
    getNotesR
      = do { (formWidget, enctype) <- generateFormPost noteForm;
             defaultLayout ($(widgetFile "notes")) }

信息似乎很清楚,问题是我不知道如何为(RenderMessage master0 FormMessage)添加实例声明。

这是我添加到 Home.hs 的代码

noteForm = renderBootstrap $ Note
    <$> areq textField "Title" Nothing
    <*> areq textField "Content" Nothing

getNotesR = do
    (formWidget, enctype) <- generateFormPost noteForm
    defaultLayout $(widgetFile "notes")

postNotesR = return ()
getNoteR noteId = return ()

Ant以下来自templates/notes.hamlet

<form method=post enctype=#{enctype}>
    ^{formWidget}
    <input type=submit>
4

2 回答 2

2

作为一个普遍的提议,当你看到这样的事情时:

No instance for (RenderMessage master0 FormMessage)

请记住,master0(或以小写字母开头的任何类似内容)是一个未实例化为具体类型的自由类型变量。a如果有帮助,您可以在精神上将其替换为。所以现在我们看到消息说没有由第二个参数唯一确定的通用实例和第一个参数中的 任意类型。RenderMessageFormMessage

因此,解决此问题的常用方法是确定您要将自由类型实例化为什么,并提供类型签名或其他提示以将其修复为该实例化。

在这种情况下,Michael Snoyman 建议的类型签名noteForm :: Form Note用于此目的。

于 2013-05-15T16:02:40.253 回答
0

添加此代码怎么样?

instance RenderMessage [The name of your Yesod instance] FormMessage where
    renderMessage _ _ = defaultFormMessage

请参阅http://www.yesodweb.com/book/internationalization

于 2013-03-24T13:52:25.087 回答