2

アプリケーションコントローラーに次のメソッドがあります。

public static Result searchJourney(String address) {
    return ok(
        views.html.searchResults.render(Journey.searchByAddress(address),journeyForm)
        );
}

これは、引数として文字列を受け取り、この文字列をモデルメソッドsearchByAddressに渡します。アドレスによる検索メソッドは、クエリの結果であるモデルオブジェクトのリストを返します。次に、これを使用してフォームに入力します。

public static List<Journey> searchByAddress(String address) {
    return find.where().ilike("start_loc", "%"+address+"%").findList();
}

私が抱えている問題は、ビューフォームからアドレス引数を取得することです。ビューは次のようになります。

@main("Journey Search", "search") {
<body>  
        <form>     
        Search for journeys starting in a town/city:
        <input type="text" name="arg"></br>
        <input type="submit" onsubmit="@routes.Application.searchJourney("@arg")" value="Search">
        </form>
    }

すべてのルーティングは期待どおりに機能していますが、この引数をコントローラーメソッドに渡すことができないようです。テキストボックスに値を入力すると、URLが更新され、入力が表示されます。

http://localhost:9000/search?arg=testvalue

しかし、結果ページが期待どおりにレンダリングされることはありません。

アップデート:

<form action="@routes.Application.searchJourney(arg)">     

    Search for journeys starting in a town/city:
    <input type="text" name="arg"></br>
    <input type="submit" value="Search">
    </form>

引数の前後に引用符と@記号がないと、not found: value argエラーが発生します。

レンダリングされる結果のHTML

@(listJourneys: List[Journey], journeyForm: Form[Journey])

  @import helper._

  @main("Search Results", "search") {
      <h1>Search Results</h1>
      <table class="table table-hover">
        <thead>
            <tr>
            <th>#</th>
            <th>Starting Location</th>
            <th>End Location</th>
            <th>Participant Type</th>
            <th>Date</th>
            <th>Time</th>
            <!--<th>User</th>-->
             </thead>
              <tbody>
            </tr>

          @for(journey <- listJourneys) {
                <tr>
                  <td>@journey.id</td>
                  <td>@journey.start_loc</td>
                  <td>@journey.end_loc</td>
                  <td>@journey.participant_type</td>
                  <td>@journey.date</td>
                  <td>@journey.time</td>
                </tr>
          }
              </tbody>
      </table> 
    }
4

1 に答える 1

5

使用する:

@routes.Application.searchJourney(arg)

それ以外の

@routes.Application.searchJourney("@arg")

ところで、なぜあなたはそれをonsubmitアトリビュートに設定しているのですか?actionこの目的のために一般的なフォームを使用する方が良いのではないですか?

編集

ああ、今では一般的に、宣言されていない引数、またはHTML形式のユーザー入力からの引数を使用してリバースルートを構築することはできないことを理解しています。それらはビューレンダリングの瞬間に存在する必要があり、何らかの値を持っている必要があります。

あなたが示したもの(http://domain.tld/search?arg=valvalをユーザーの入力からどこに得るかを取得するにはarg、オプションのパラメータとしていくつかのデフォルト値を持つルートを使用する必要があります(あなたの場合、おそらく空の文字列が良いでしょう:

GET  /search      controllers.Application.searchJourney(arg: String ?= "") 

アクション:

public static Result searchJourney(String arg) {
    return ok(
        searchResults.render(Journey.searchByAddress(arg),journeyForm);
    );
}

action次に、フォームをこのルートにarg設定せずに、そのメソッドをget次のように設定する必要があります。

<form action="@routes.Application.searchJourney()" method="get">
   ...
</form>

ルートにパラメータを設定しないこともできます。

GET   /search      controllers.Application.searchJourney
or
POST  /search      controllers.Application.searchJourney

DynamicForm次に、リクエストからフィールドをバインドする例を使用します。

public static Result searchJourney() {
    String arg = form().bindFromRequest.get("arg");
    // perform some basic validation here
    return ok(
        searchResults.render(Journey.searchByAddress(arg),journeyForm);
    );
}
于 2013-03-26T14:30:49.147 に答える