rails 3路由问题(路由错误“没有路由匹配...”)

时间:2011-01-27 03:39:26

标签: ruby-on-rails routing routes custom-routes

我正在使用ruby 1.9.2和rails 3,我认为我在路由方面遇到了一个简单的问题。

我有一个名为AdvancedQuery的模型。 它的控制器是AdvancedQueriesController几乎除了路由之外,所有内容都以标准的rails方式完成。我想更改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.html.haml,向用户显示要填写的标准表单。
  2. 然后,用户将数据输入搜索表单并按“提交”
  3. “Submit”调用“create”方法并在数据库中创建“AdvancedQuery”记录。 AdvancedQuery对象具有与之关联的32个字符的哈希,1)标识查询,2)用作结果URL的一部分(参见步骤4)。
  4. create方法重定向到“search”方法,其中AdvancedQuery对象用于搜索第二个模型(称为BusinessModel)。然后,服务器呈现search.html.haml,然后显示AdvancedQuery的结果,并且在用户想要运行新搜索的情况下,将结果重新呈现在与结果相同的页面上。此处生成的URL为:http://localhost:3000/advanced_query/blah(其中blah是与查询特别关联的32个字符的哈希值)。
  5. 现在,用户使用步骤3中生成的网页中的表单输入新的搜索词。他按“提交”并再次调用“创建”方法(即我们重新执行步骤3和4) )。即创建一个新的AdvancedQuery。
  6. 以下是现实中发生的事情:

    步骤1 - 4按预期工作。第5步给出了路由错误 "No route matches "/advanced_query"

    new.html.hamlsearch.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
    

    有关导致我的路由错误的任何想法?

    谢谢!

3 个答案:

答案 0 :(得分: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可能会有所帮助;你想要传递的内容并不完全清楚。

答案 1 :(得分: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

答案 2 :(得分: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

然后没有路由错误。