我正在使用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时期望的行为:
advanced_queries_controller
中的“新”方法。呈现new.html.haml
,向用户显示要填写的标准表单。search.html.haml
,然后显示AdvancedQuery的结果,并且在用户想要运行新搜索的情况下,将结果重新呈现在与结果相同的页面上。此处生成的URL为:http://localhost:3000/advanced_query/blah(其中blah是与查询特别关联的32个字符的哈希值)。以下是现实中发生的事情:
步骤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
有关导致我的路由错误的任何想法?
谢谢!
答案 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
然后没有路由错误。