【问题标题】:How can the same request by interpreted as JSON and as */* in Rails?在 Rails 中如何将相同的请求解释为 JSON 和 */*?
【发布时间】: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


【解决方案1】:

原来我的 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

之后就很明显了!

【讨论】:

    猜你喜欢
    • 2013-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-29
    • 2021-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多