0

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

我有一个模型叫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.html.haml呈现给用户一个要填写的标准表格。
  2. 用户然后在搜索表单中输入数据并按“提交”
  3. “提交”调用“创建”方法并在数据库中创建“高级查询”记录。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。

以下是现实中发生的事情:

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