0

私はruby1.9.2とrails3を使用していますが、ルーティングに関して適度に単純な問題が発生していると思います。

というモデルがありAdvancedQueryます。そのコントローラーはAdvancedQueriesControllerです。 ルーティングを除いて、ほとんどすべてが標準のレール方式で行われます。URLの名前を変更したかったのですが、他にもいくつか変更したかったのです(以下を参照)。

これが私のroutes.rbファイルの関連部分です

get   "advanced_query" => "advanced_queries#new", as: :new_advanced_query
post  "advanced_query(/:hash_value)(/:page)" => "advanced_queries#create",  as: :create_advanced_query
get   "advanced_query/:hash_value(/:page)"  => "advanced_queries#search",  as: :advanced_query_search

AdvancedQueryを使用するときに期待する動作は次のとおりです。

  1. ユーザーはhttp:// localhost:3000 / advanced_query(get request)にアクセスし、ブラウザーはで「new」メソッドを呼び出しますadvanced_queries_controllernew.html.hamlがレンダリングされ、ユーザーに入力する標準フォームが表示されます。
  2. 次に、ユーザーは検索フォームにデータを入力し、[送信]を押します
  3. 「Submit」は「create」メソッドを呼び出し、データベースに「AdvancedQuery」レコードを作成します。AdvancedQueryオブジェクトには32文字のハッシュが関連付けられており、1)クエリを識別し、2)結果のURLの一部として使用されます(手順4を参照)。
  4. createメソッドは、AdvancedQueryオブジェクトを使用して2番目のモデル(BusinessModelと呼ばれる)を検索する「search」メソッドにリダイレクトします。次に、サーバーsearch.html.hamlはAdvancedQueryの結果をレンダリングして表示し、ユーザーが新しい検索を実行したい場合に備えて、結果と同じページに元のフォームを再レンダリングします。ここで生成されるURLは次のとおりです。http:// localhost:3000 / advanced_query / blah(ここで、blahは、クエリに特に関連付けられている32文字のハッシュです)。
  5. ここで、ユーザーはステップ3で生成されたWebページのフォームを使用して新しい検索語を入力します。ユーザーは「送信」を押すと、「作成」メソッドが再度呼び出されます(つまり、ステップ3と4をやり直します)。つまり、新しいAdvancedQueryを作成します。

これが実際に起こることです:

手順1〜4は期待どおりに機能します。ステップ5でルーティングエラーが発生します"No route matches "/advanced_query"

new.html.hamlとファイルの両方がsearch.html.haml同じ部分をレンダリングします(と呼ばれます_form.html.haml)。

したがって、を見ると_form.html.haml、実際には何も問題はありません。

= form_for(@advanced_query, url: create_advanced_query_path) do |f|
  .actions
   # other generic form-related stuff

これが私のコントローラーの関連部分です

  def new
    @advanced_query  = AdvancedQuery.new
  end

  def create
    advanced_query  = AdvancedQueryBuilder.build_advanced_query_from_post(request, params, current_user)
    redirect_to(advanced_query_search_path(hash_value: advanced_query.hash_value))
  end

  def search
    return render :bad_request unless request.get?
    @advanced_query  = AdvancedQuery.find_by_hash_value_and_user_id(params[:hash_value], current_user.id)
    @results              = BusinessModel.advanced_search(@advanced_query)
  end

ルーティングエラーの原因について何か考えはありますか?

ありがとう!

4

3 に答える 3

1

Routes.rbの括弧が正しく一致していないようです-

post  "advanced_query(/:hash_value(/:page))" => "advanced_queries#create",  as: :create_advanced_query

それ以外の

post  "advanced_query(/:hash_value)(/:page)" => "advanced_queries#create",  as: :create_advanced_query

ここのセクション3:http: //guides.rubyonrails.org/routing.htmlが役立つかもしれません。何を渡そうとしているのかが完全には明確ではありません。

于 2011-01-27T04:03:20.997 に答える
1

ルートファイルは次のようになります。

get   "/advanced_query" => "advanced_queries#new", :as => :new_advanced_query
post  "/advanced_query(/:hash_value(/:page))" => "advanced_queries#create",  :as => :create_advanced_query
get   "/advanced_query/:hash_value(/:page)"  => "advanced_queries#search",  :as => :advanced_query_search
于 2011-01-27T05:21:31.737 に答える
1

それで、エラーが発生している理由はよくわかりませんが、エラーを理解しました。

search.html.hamlにレンダリングされたフォームが「POST」としてリストされていても、ログファイルにPOSTであると記載されていても、PUTで​​あることがわかります。

したがって、routes.rbファイルを次のように変更すると、次のようになります。

get   "advanced_query" => "advanced_queries#new", as: :new_advanced_query
post  "advanced_query(/:hash_value(/:page))" => "advanced_queries#create",  as: :create_advanced_query
put   "advanced_query(/:hash_value(/:page))" => "advanced_queries#create", as: :create_advanced_query
get   "advanced_query/:hash_value(/:page)"  => "advanced_queries#search",  as: :advanced_query_search

その後、ルーティングエラーは発生しません。

于 2011-01-27T05:25:59.817 に答える