【发布时间】:2014-02-13 13:02:35
【问题描述】:
注意:问题的要点在下面的第一次更新中
我正在维护一个 Rails 项目,我注意到如果我执行 GET "/request/past_list",我会被路由到 RequestController#show
在routes.rb 我得到了:
get '/request/past_list', to: 'request#past_list'
get '/request/:id', to: 'request#show'
并运行rake routes 我得到(可以预见的):
request_past_list GET /request/past_list(.:format) request#past_list
GET /request/:id(.:format) request#show
所以我想知道为什么 Rails 认为我在 url 中的 past_list 字符串实际上是 :id?
目前这是我实施的解决方法:
def show
if ((params[:id]).is_a? String and (params[:id].eql? "past_list"))
past_list
else
..
但是我已经因为它而在晚上睡不着觉了..我希望知道到底发生了什么来让我的良心安息
附言这是 chrome 开发工具上的网络请求的样子,以防万一有一些细节可能引发危险信号:
更新:我注意到当前代码中请求的解释方式有所不同:
Started GET "/request/past_list" for 127.0.0.1 at 2014-02-13 15:41:14 +0200
Processing by RequestController#show as JSON
还有我从 git 历史中挖掘出来的旧工作:
Started GET "/request/past_list" for 127.0.0.1 at 2014-02-13 15:43:40 +0200
Processing by RequestController#past_list as */*
问题是旧的工作代码具有完全相同的 routes.rb 文件..那里没有变化!
所以我想这是将请求解释为 JSON 和 */*.. 之间的区别。
第二次更新:
这里有两个与*/* 业务相关的问题:
When do Rails controllers render as JS, HTML, or 'q'?
和
Rails 3 Processing by */*
【问题讨论】:
-
能否提供
rake routes的相关输出? -
@xlembouras 我已经做了
-
在
routes.rb中将past_list更改为:past_list然后你应该得到params[:past_list]或者你在show操作中编写重定向params[:id] == past_list -
使用双引号也会出现这种情况吗?
-
@Bala 双引号不起作用,结果相同(但请参阅我的更新)
标签: ruby-on-rails ruby ruby-on-rails-3 routes