2011-01-27 14 views
0

私はruby 1.9.2とレール3を使用していますが、私はルーティングに関してやや単純な問題があると思います。rails 3 routing question(ルーティングエラー "No route matches ...")

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

私のルーティングを引き起こしているもの上の任意の考えがありますエラー?

ありがとうございます!

答えて

1

経路内のかっこのようです。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が役立つ可能性があります。それはあなたが合格するために探しているものを完全には明らかではありません

+0

正しいとは言えませんが、指摘している構文の問題を修正しても、同じルーティングエラーが発生します。 routes.rbファイルの私の新しい行は:post "advanced_query /(:hash_value(/:page))" – user141146

+0

おっと、ごめんなさい - 上記の私の編集を参照してください。 /は、カッコの内側でなければならず、外側ではありません。 –

+0

ありがとうございます。私はあなたが何を言おうとしているのか理解していました(オプションの "slugs"の構文は間違っていました)が、POSTを実行していると思ったときに私のフォームが "PUT"しかし、それがなぜであるか分かりません。 – user141146

1

あなたのroutesファイルは次のようになります。

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 
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 

は、その後何のルーティングエラーはありません。

関連する問題