注意:问题的要点在下面的第一次更新中
我正在维护一个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认为我的网址中的past_list
字符串实际上是:id
?
目前这是我实施的解决方法:
def show
if ((params[:id]).is_a? String and (params[:id].eql? "past_list"))
past_list
else
..
但是因为它我已经在晚上睡觉时遇到了麻烦..我希望知道我的良心是怎么回事
P.S。这就是chrome dev工具上的网络请求,以防万一有些细节可能引发红旗:
更新:我注意到在当前代码中解释请求的方式有所不同:
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 */*
答案 0 :(得分:0)
事实证明我在routes.rb文件中有这个:
get '/request/:id', to: 'request#show', :defaults => {:format => :json}
所以我简单地删除了它。
为了让你们从这次讨论中脱颖而出..诀窍是this git命令:
$ git diff $things_were_working_commit..$things_weren't_working_commit -- routes.rb
之后就显而易见了!