【发布时间】:2011-01-28 17:43:34
【问题描述】:
在我从 Rails 2.3.4 升级到 Rails 3.0.3 后,我遇到了另一个非常令人费解的问题。
我正在使用以下 URL 调用“显示”控制器方法:
/verse/10
我在终端中看到了这个
开始为 127.0.0.1 获取“/verse/10” 在 2011-01-27 16:17:58 -0800
由 VersesController 处理#show 作为 HTML
* 搜索带有 ID 的诗句:渲染的 verses/show.html.erb 内 布局/应用程序(76.6 毫秒)
在 1006 毫秒内完成 200 次 OK(查看次数: 125.4 毫秒 |活动记录:9.8 毫秒)
诗歌展示方法很简单:
def show
logger.debug("*** Searching for verse with ID: #{params[:id]}")
@vs = Verse.find(params[:id])
end
路由定义如下:
match '/verse/:id', :to => 'verses#show', :as => 'verse'
问题:在本例中为 '10' 的参数 ID 没有被传递给控制器方法,因此抛出 404,因为 params[:id] 为 nil。
“rake routes | grep verse”的输出如下:
verse /verse/:id(.:format) {:controller=>"verses", :action=>"show"}
我在这方面花了很长时间,但感觉好像我错过了一些非常明显的东西。
这是完整的 rake 路由输出:
login /login(.:format) {:controller=>"sessions", :action=>"new"}
logout /logout(.:format) {:controller=>"sessions", :action=>"destroy"}
register /register(.:format) {:controller=>"users", :action=>"create"}
signup /signup(.:format) {:controller=>"users", :action=>"new"}
activate /activate/:activation_code(.:format) {:activation_code=>nil, :controller=>"users", :action=>"activate"}
forgot_password /forgot_password(.:format) {:controller=>"passwords", :action=>"new"}
change_password /change_password/:reset_code(.:format) {:controller=>"passwords", :action=>"reset"}
open_id_complete GET /opensession(.:format) {:controller=>"sessions", :action=>"create"}
open_id_create GET /opencreate(.:format) {:controller=>"users", :action=>"create"}
users GET /users(.:format) {:action=>"index", :controller=>"users"}
POST /users(.:format) {:action=>"create", :controller=>"users"}
new_user GET /users/new(.:format) {:action=>"new", :controller=>"users"}
edit_user GET /users/:id/edit(.:format) {:action=>"edit", :controller=>"users"}
user GET /users/:id(.:format) {:action=>"show", :controller=>"users"}
PUT /users/:id(.:format) {:action=>"update", :controller=>"users"}
DELETE /users/:id(.:format) {:action=>"destroy", :controller=>"users"}
passwords GET /passwords(.:format) {:action=>"index", :controller=>"passwords"}
POST /passwords(.:format) {:action=>"create", :controller=>"passwords"}
new_password GET /passwords/new(.:format) {:action=>"new", :controller=>"passwords"}
edit_password GET /passwords/:id/edit(.:format) {:action=>"edit", :controller=>"passwords"}
password GET /passwords/:id(.:format) {:action=>"show", :controller=>"passwords"}
PUT /passwords/:id(.:format) {:action=>"update", :controller=>"passwords"}
DELETE /passwords/:id(.:format) {:action=>"destroy", :controller=>"passwords"}
session POST /session(.:format) {:action=>"create", :controller=>"sessions"}
new_session GET /session/new(.:format) {:action=>"new", :controller=>"sessions"}
edit_session GET /session/edit(.:format) {:action=>"edit", :controller=>"sessions"}
GET /session(.:format) {:action=>"show", :controller=>"sessions"}
PUT /session(.:format) {:action=>"update", :controller=>"sessions"}
DELETE /session(.:format) {:action=>"destroy", :controller=>"sessions"}
quests GET /quests(.:format) {:action=>"index", :controller=>"quests"}
POST /quests(.:format) {:action=>"create", :controller=>"quests"}
new_quest GET /quests/new(.:format) {:action=>"new", :controller=>"quests"}
edit_quest GET /quests/:id/edit(.:format) {:action=>"edit", :controller=>"quests"}
quest GET /quests/:id(.:format) {:action=>"show", :controller=>"quests"}
PUT /quests/:id(.:format) {:action=>"update", :controller=>"quests"}
DELETE /quests/:id(.:format) {:action=>"destroy", :controller=>"quests"}
index /home(.:format) {:controller=>"verses", :action=>"index"}
starter_pack /starter_pack(.:format) {:controller=>"verses", :action=>"starter_pack"}
*verse /verse/:id(.:format) {:controller=>"verses", :action=>"show"}*
tag_cloud /tag_cloud(.:format) {:controller=>"verses", :action=>"tag_cloud"}
show_user_info /show_user_info(.:format) {:controller=>"admin", :action=>"show_user_info"}
show_tags /show_tags(.:format) {:controller=>"admin", :action=>"show_tags"}
contact /contact(.:format) {:controller=>"info", :action=>"contact"}
faq /faq(.:format) {:controller=>"info", :action=>"faq"}
tutorial /tutorial(.:format) {:controller=>"info", :action=>"tutorial"}
volunteer /volunteer(.:format) {:controller=>"info", :action=>"volunteer"}
leaderboard /leaderboard(.:format) {:controller=>"info", :action=>"leaderboard"}
stateboard /stateboard(.:format) {:controller=>"info", :action=>"stateboard"}
countryboard /countryboard(.:format) {:controller=>"info", :action=>"countryboard"}
referralboard /referralboard(.:format) {:controller=>"info", :action=>"referralboard"}
news /news(.:format) {:controller=>"info", :action=>"news"}
update_profile /update_profile(.:format) {:controller=>"profile", :action=>"update_profile"}
referrals /referrals/:id(.:format) {:controller=>"profile", :action=>"referrals"}
unsubscribe /unsubscribe/*email(.:format) {:controller=>"profile", :action=>"unsubscribe"}
edit_tag /edit_tag/:id(.:format) {:controller=>"tag", :action=>"edit_tag"}
tweets /tweets(.:format) {:controller=>"tweets", :action=>"index"}
load_progress /load_progress/:user(.:format) {:controller=>"chart", :action=>"load_progress"}
root /(.:format) {:controller=>"sessions", :action=>"new"}
home /home(.:format) {:controller=>"sessions", :action=>"new"}
/:controller(/:action(/:id))(.:format)
【问题讨论】:
-
检查
rake routes的输出以确保这是匹配的实际路由。还有params.inspect的结果是什么? -
这可能是路由优先级问题...您可以发布您的
routes.rb文件吗? -
我已经添加了上面“rake routes”的输出。 Params.inspect 是一个空数组:Params.inspect: {}
-
有没有机会使用
open_id_authentication插件?最近有一个类似的空参数哈希问题,通过删除这个不兼容的插件解决了这个问题。另一种选择是删除vendor/plugins下的所有内容,看看这条路线是否有效,然后一次将它们添加回来。 -
Andy:dmarkow 询问的是“rake routes”输出,以检查是否有其他路由首先匹配。 grep 后的输出不行 - 请发布完整的输出。
标签: ruby ruby-on-rails-3