2011-01-27 133 views
0

我使用红宝石1.9.2和轨道3,我想我有一个适度简单的路由问题。轨道3路由问题(路由错误“没有路由匹配...”)

我有一个模型叫AdvancedQuery。 其控制器为AdvancedQueriesController几乎所有除了路由之外,一切都以标准导轨方式完成。我想更改网址的名称,我想更改其他一些内容(请参阅下文)。

这里是我的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请求)并且浏览器调用advanced_queries_controller中的“新”方法。呈现new.html.haml,其向用户显示填写的标准表格。
  2. 用户然后将数据输入到搜索表单中并按下“Submit”
  3. “Submit”调用“create”方法并在数据库中创建“AdvancedQuery”记录。 AdvancedQuery对象有一个32字符的散列关联它,1)标识查询和2)被用作结果URL的一部分(见步骤4)。
  4. 创建方法重定向到“搜索”方法,其中AdvancedQuery对象用于搜索第二个模型(称为BusinessModel)。然后,服务器呈现search.html.haml,然后显示AdvancedQuery的结果,并且在用户想要运行新搜索的情况下,它将原始表单重新呈现在与结果相同的页面上。这里生成的URL是:http://localhost:3000/advanced_query/blah(其中blah是与查询特定关联的32个字符的散列)。
  5. 现在用户使用步骤3中生成的网页中的表单输入一个新的搜索词。他按下“submit”并再次调用“create”方法(即我们重新执行步骤3 & 4) 。即创建一个新的AdvancedQuery。

这里是在现实中发生的事情:

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

上是什么导致我的路由有什么想法错误?

谢谢!

回答

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 2011-01-27 04:46:06

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

那就没有路由错误。

相关问题