2011-08-09 10 views
1

Boot.boot()に次の書き換えがあります。これは、Lift WikiのURL Rewritingセクションにある指示に基づいています。サイトマップのリンクを参照した後でもRewriteRequestが機能しないのはなぜですか?

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 

    } 
}) 

すべてがアクセス可能になることを確認サイトマップ「を作成/モデル/ createEdit」へのアクセスを許可し、次の行で、「モデル/ 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 

、2番目のメニューオプションは、最初はyeldsながら、コンテナレベルの「HTTPエラー404 問題へのアクセス/モデル/ createEditを作成/」動作します。

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 

に表示されます。

私はScala 2.9.0-1でLift 2.4-M3を使用しています。

誰でも問題は何か考えていますか?

ありがとうございました。

:コードサンプルが変更され、コンソール出力が追加され、何が起きているのかが明確になりました。

+0

最初のメニュー(「createEditM」)は決してアクセスされません。すべてのリクエスト/ models/createEdit /?/models/createEditにリダイレクトされます – coubeatczech

+0

@coubeatczech - _menu_ "createEditM"がインターフェイスに表示され、それをクリックできます。クリックすると新しいリクエストが発生するため、_rerite_がジャンプして_404_になります。私は_rewrite_が "書き換えパス:createEdit.htmlへのモデル/ createEdit/Create"がコンソールに表示されるためにトリガされることを知っています。モデル/ createEdit.htmlスニペットが見つかりません。 : –

+0

リライトがトリガされ、モデル/ createEdit.htmlを含むレスポンスが作成されることを示す新しい編集が行われました –

答えて

1

最初に、リライトのものを使用しないでください。それは低レベルで、一般的には必要ありません。

パラメータ化されたメニューエントリが必要な場合は、Menu.paramを使用します。 http://simply.liftweb.net/index-3.2.html#toc-Subsection-3.2.7

+0

こんにちはDavid。私の実装は機能しているので、私はしばらくの間他のことをしています。時間があると(ページにある可能性のある他のすべての状態を処理するコードを追加すると発生します)、結果をここに掲載します。しかし、お返事ありがとうございます。 :) –

2

書き換えの問題を解決するために、書き換えルールを削除し、次のコードでカスタムLocオブジェクトを実装しました。

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 

そして、それが行われています:このオブジェクトに

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 
} 

は、私が唯一のサイトマップの参照を追加する必要がありましたimpleemented!

+0

これは非常に冗長であり、それをするために。その理由から、誰かが私が書き換えルール(より単純なもの)にあった問題の解決策を提示しているかどうかを確認するために、この質問をもう少し長く開いておきます。 –

関連する問題