Hi Naftoli,
The code I have is:
def allexpenses(expenseTemplate: NodeSeq): NodeSeq = Expense.findAll(By
(Expense.month,m.toLong)).flatmap ({ month =>
bind("month", expenseTemplate,
"name" -> Text( month.item ),
"amount" -> Text( month.amount )
)
})
bind("thismonth", xhtml, "expenseitem" -> allexpenses _)
which gives the error: value flatmap is not a member of List
[demo.expenses.model.Expense]
>From what you've said, I'm not sure how to remove the flatmap without
generating another error. I realise this is a bit cheeky, but please
humour me and rewrite my code above to remove the flatmap and errors.
Also given an ID, how can I create an instance of a Month class whose
ID matches that ID?
Regards,
Paul.
On 18 Jan, 21:57, Naftoli Gugenheim <[email protected]> wrote:
> val l = List(1,2,3)
> l.map(x => x * 2) == List(2,4,6)
> So map take as its argument a function that transforms every member of the
> list.
> flatmap is similar but instead of the new List *consisting of* the
> transformed elements, it consists of the *concatenation* of the results of
> the function (which must be concatenatable). So
> l.flatmap(x => List(x, x * 2)) == List(1,2) ++ List(2,4) ++ List(3,6) ==
> List(1,2,2,4,3,6)
> Since bind returns a NodeSeq, if you would return the result of bind from a
> function you pass to *map* you would have a List of NodeSeq. Flatmap means
> you'll get the NodeSeq for each List element concatenated into one long
> NodeSeq.
> So your code needs to continue
> ...flatmap { curExpense =>
> bind("prefix", expenseTemplate, ...)
>
> }
>
> -------------------------------------
>
> pabraham<[email protected]> wrote:
>
> Hi Adam,
>
> Thanks for your advice. Unfortunately if I paste your code, I get
> "error: not found: value expensesformonth".
>
> I need to convert my "m" value to an instance of Month where the ID of
> this instance is "m", but I can't work out how.
>
> I then tried this:
>
> def allexpenses(expenseTemplate: NodeSeq): NodeSeq = Expense.findAll(By
> (Expense.month,m.toLong)).flatmap
>
> but the findAll() gives a List[] not a flatmap, and my Scala isn't
> good enough to convert from one to the other!
>
> Regards,
>
> Paul.
>
> On 18 Jan, 08:32, Adam Warski <[email protected]> wrote:
>
> > Hello,
>
> > > I have HTML to print out expenses for a given month (i.e. URL = .../
> > > month/12):
>
> > > <lift:MonthPage.summary>
> > > ...
> > > <thismonth:expenseitem>
> > > <tr>
> > > <td><month:item /></td>
> > > <td align="right"><month:amount /></td>
> > > </tr>
> > > </thismonth:expenseitem>
> > > ...
> > > </lift:MonthPage.summary>
>
> > > The area I'm having problems with is the code to drive the above
> > > HTML. I need something like:
>
> > > class MonthPage {
> > > def summary( xhtml : NodeSeq ) : NodeSeq = S.param("month") match {
> > > case Full(m) => {
> > > val allexpenses : NodeSeq = expensesformonth.flatmap({ month =>
> > > bind("month", chooseTemplate("thismonth", "expenseitem",
> > > xhtml),
> > > "name" -> Text( month.item ),
> > > "amount" -> Text( month.amount )
> > > )
> > > })
> > > bind("thismonth", xhtml, "expenseitem" -> allexpenses)
> > > }
> > > case _ => {
> > > Text( "Not a valid month." )
> > > }
> > > }
> > > }
>
> > I think you're almost there.
> > Try making the "allexpenses" val a function (def) NodeSeq => NodeSeq. The
> > function takes the "template" of the month and returns it with bound
> > values. So something like:
>
> > class MonthPage {
> > def summary( xhtml : NodeSeq ) : NodeSeq = S.param("month") match {
> > case Full(m) => {
> > def allexpenses(expenseTemplate: NodeSeq): NodeSeq =
> > expensesformonth.flatmap({ month =>
> > bind("month", expenseTemplate,
> > "name" -> Text( month.item ),
> > "amount" -> Text( month.amount )
> > )
> > })
> > bind("thismonth", xhtml, "expenseitem" -> allexpenses _)
> > }
> > case _ => {
> > Text( "Not a valid month." )
> > }
> > }
>
> > }
>
> > No need to lookup the right template then using chooseTemplate, as the
> > method receives the appropriate xhtml.
>
> > --
> > Adam
>
> --
> You received this message because you are subscribed to the Google Groups
> "Lift" group.
> To post to this group, send email to [email protected].
> To unsubscribe from this group, send email to
> [email protected].
> For more options, visit this group
> athttp://groups.google.com/group/liftweb?hl=en.
--
You received this message because you are subscribed to the Google Groups
"Lift" group.
To post to this group, send email to [email protected].
To unsubscribe from this group, send email to
[email protected].
For more options, visit this group at
http://groups.google.com/group/liftweb?hl=en.