Почему RewriteRequest не работает даже после ссылки на ссылку в карте сайта? - PullRequest
1 голос
/ 09 августа 2011

У меня есть следующая перезапись в Boot.boot ().Это основано на инструкциях, найденных в разделе Перезапись URL в Lift Wiki.

LiftRules.statefulRewrite.prepend(NamedPF("CreateAndEditRewrite") {
  case RewriteRequest(
        ParsePath("models" :: "createEdit" :: state :: Nil, _, _,_), _, _) => {
      Console.println("Rewriting path: models/createEdit/Create to createEdit.html")
      val rewriteResp = RewriteResponse(
        "models/createEdit" :: Nil, "html" // Use webapp/models/creteEdit.html
      )
      Console.println("Response refers to URL " + rewriteResp.path + " with parameters " + rewriteResp.params.toList.map(x => "" + x.key + "=" + x.value + ", "))
      rewriteResp

  }
})

Чтобы убедиться, что все доступно, убедитесь, что SiteMap разрешил доступ к "models / createEdit /create "and" models / createEdit "со следующими строками.

val entries =
     Menu(Loc("models", List(""), "Models"),
         Menu(Loc("createEditM", List("models","createEdit","Create"), "[NEW]Create Model", loggedIn)),
         Menu(Loc("createEditMXX", List("models","createEdit"), "[NEW]Create Model", loggedIn)) ) ::
     User.sitemap

// Build SiteMap
LiftRules.setSiteMap(SiteMap(entries:_*))
LiftRules.passNotFoundToChain = true //if a URL isn't found pass responsability to the container

Тем не менее, второй параметр меню работает, в то время как первый выдает« Ошибка HTTP 404 при доступе к / models / createEdit / Create »в контейнереlevel.

Следующие println появляются на консоли

Rewriting path: models/createEdit/Create to createEdit.html
Response refers to URL ParsePath(List(models/createEdit),html,true,false) with parameters List()
INFO - Service request (GET) /models/createEdit/Create returned 0, took 11 Milliseconds

, что означает, что перезапись была запущена.

Я использую Lift 2.4-M3 с Scala 2.9.0-1.

Кто-нибудь знает, в чем проблема?

Спасибо.

Редактировать : изменен пример кода и добавлен вывод консоли напроясните происходящее.

Ответы [ 2 ]

2 голосов
/ 15 августа 2011

Чтобы решить проблему написания, я удалил правило перезаписи и реализовал пользовательский объект Loc со следующим кодом.

package pt.cnbc.wikimodels.client

package object sitemapTweaks {
  import net.liftweb.common.Full
  import net.liftweb.http.{RewriteResponse, ParsePath, RewriteRequest}
  import net.liftweb.sitemap.Loc
  import net.liftweb.common.Box
  import net.liftweb.sitemap.Loc.{
  Link, LinkText, LocParam, Hidden
  }
  import net.liftweb.sitemap.Loc.If._
  import pt.cnbc.wikimodels.snippet.User
  import net.liftweb.sitemap.Loc._

  // verification if the user is logged
  val loggedIn = If(() => User.loggedIn_?, "You must be logged in.")

  object ModelPageLoc extends Loc[ModelPageState] {
    var state:ModelPageState = defaultValue.openTheBox
    def name: String = "CreateEDitWithState"

    def link = new Link[ModelPageState]("models" :: "createEdit" :: "Create" :: Nil)

    def text = "Model handling" + defaultValue

    def params: List[LocParam[ModelPageState]] = List(loggedIn)

    override def rewrite = Full({
      case RewriteRequest(ParsePath(List("models", "createEdit", _state), _, _, _), _, _) => {
        _state match {
          case "Create" => {
            state = Create
            (RewriteResponse(List("models", "createEdit")), Create)
          }
          case _ => {
            state = Edit
            (RewriteResponse(List("models", "createEdit")), Edit)
          }
        }
      }
    })
    def defaultValue: Box[ModelPageState] = Full(Create)
  }

  sealed abstract class ModelPageState

  case object Create extends ModelPageState

  case object Edit extends ModelPageState
}

После реализации этого объекта мне осталось только добавить ссылку на карту сайта:

val entries =
     Menu(Loc("models", List(""), "Models"),
         Menu(Loc("createEditMXX", List("models","createEdit"), "[NEW]Create Model", loggedIn)),
         Menu(ModelPageLoc), //This line calls the customized Loc object
     User.sitemap

// Build SiteMap
LiftRules.setSiteMap(SiteMap(entries:_*))
LiftRules.passNotFoundToChain = true //if a URL isn't found pass responsability to the container

И все готово!

1 голос
/ 18 августа 2011

Во-первых, не используйте переписывать вещи. Это низкий уровень и обычно не требуется.

Если вы хотите параметризованный пункт меню, используйте Menu.param. Смотри http://simply.liftweb.net/index-3.2.html#toc-Subsection-3.2.7

...