15

したがって、Play 2.0では、次のようになりました。

GET     /tasks/add              controllers.Tasks.addTask(parentId: Option[Long] = None)
GET     /tasks/:parentId/add    controllers.Tasks.addTask(parentId: Option[Long])

このようなコントローラーメソッドを使用すると、次のようになります。

def addTask(parentId: Option[Long]) = Action { 
    Ok(views.html.addTask(taskForm, parentId))  
}

そしてそれは働いていた。2.1に移行すると、これらの行について次のように文句を言うようです。No URL path binder found for type Option[Long]. Try to implement an implicit PathBindable for this type.基本的に、私が達成しようとしているのは、を受け入れる同じメソッドへのルートtasks/addとルートリンクを設定することです。これを行う方法はありますか?ありがとう。tasks/123/addOptional[Long]

わかりました。バグではないので、Lighthouseの機能応答です。「オプションのパスパラメータを設定しても意味がないため、パスバインド可能オブジェクトのOption[Long]サポートを削除しました。独自のパスパラメータを実装できます。よろしければ、それをサポートするパスバインド可能です。」これまでのところ、私は2つの解決策を持っており、親IDとして-1を渡しますが、これはあまり好きではありません。または、2つの異なる方法があります。これは、この場合はおそらくより理にかなっています。PathBindableの実装は今のところあまり実現可能ではないように思われるので、おそらく2つのメソッドを使用することに固執します。

4

5 に答える 5

15

Play 2.0Optionはパスパラメータでサポートされていましたが、Play 2.1はこれをサポートしなくなり、PathBindableforOptionを削除しました。

考えられる解決策の1つは次のとおりです。

package extensions
import play.api.mvc._
object Binders {
  implicit def OptionBindable[T : PathBindable] = new PathBindable[Option[T]] {
    def bind(key: String, value: String): Either[String, Option[T]] =
      implicitly[PathBindable[T]].
        bind(key, value).
        fold(
          left => Left(left),
          right => Right(Some(right))
        )

    def unbind(key: String, value: Option[T]): String = value map (_.toString) getOrElse ""
  }
}

Build.scalaそして、これをusingに追加しroutesImport += "extensions.Binders._"ます。実行するplay clean ~runと、動作するはずです。オンザフライでバインダーをリロードすると、機能する場合があります。

于 2013-02-20T16:26:06.450 に答える
6

疑問符を追加する必要があると思います。

controllers.Tasks.addTask(parentId: Option[Long] ?= None)

于 2013-02-20T14:19:12.270 に答える
5

このroutes-with-optional-parameterから、提案は次のようになります。

GET   /                     controllers.Application.show(page = "home")
GET   /:page                controllers.Application.show(page)
于 2013-02-20T14:31:47.570 に答える
2

デフォルト値を渡さなくても問題を解決する簡単な方法は、パラメーターをオプションでラップする簡単なプロキシメソッドを追加することです。

ルート:

GET     /tasks/add              controllers.Tasks.addTask()
GET     /tasks/:parentId/add    controllers.Tasks.addTaskProxy(parentId: Long)

コントローラ:

def addTask(parentId: Option[Long] = None) = Action { 
    Ok(views.html.addTask(taskForm, parentId))  
}

def addTaskProxy(parentId: Long) = addTask(Some(parentId))
于 2016-08-06T01:06:52.640 に答える
1

パスをとして指定し、反対側でエラーが発生した場合、次のようGET/foo:idに実行できます。リクエストが次のようになることを期待して機能します。controllers.Application.foo(id : Option[Long] ?= None)It is not allowed to specify a fixed or default value for parameter: 'id' extracted from the pathGET/foo controllers.Application.foo(id : Option[Long] ?= None).../foo?id=1

于 2013-02-20T17:08:55.917 に答える