【问题标题】:Sinatra Routes conflictSinatra 路线冲突
【发布时间】:2013-01-20 20:57:22
【问题描述】:

在我的应用程序中,我有以下两条路线

get '/' do
   ...
   haml :home
end

get '/:id' do
    @variable = Something.get(params[:id])
    somethingelse = @variable.some_method
    ...
    haml :show
end

如果我使用shotgun 执行我的应用程序并访问 localhost:9393(shotgun 的默认地址和端口),一切正常,即日志中不显示错误消息

如果我使用通常的ruby app.rb 运行服务器(也安装了瘦)并访问 localhost:4567,那么它会抱怨 NilClass 没有方法“some_method”......好像第二条路线后面跟着空字符串id

在 Sinatra 文档中,据说路由是按顺序调用的,因此它甚至不应该遇到第二个。我错了吗?

作为测试,我把第二条路由改成'/:id/show',就没有报错了。

在这两种情况下(我的意思是使用霰弹枪和普通服务器)网站都完美呈现,即在/ 中,视图正确地是 home.haml 而不是 show.haml。所以错误只存在于日志文件中。说实话,@variable.some_method 是直接在视图中调用的,而在浏览/ 时,我收到了来自/show.haml 的错误。

做什么?为了不再遇到此错误,我应该做些什么吗?我应该明目张胆地忽略它吗?

编辑:代码的输出和相关部分可以在这里找到:https://gist.github.com/4585374

【问题讨论】:

  • 我不认为这取决于您提供的信息中 Sinatra 的路线选择。如果您添加进一步的日志记录,甚至在每个路由和每个视图中添加warn,这将对您有所帮助,这样您就可以看到什么时候被调用。顺便说一句,您的第二条路线的代码中有错字。
  • 我添加了我在原始问题中得到的输出。感谢您的错字,它只是在这里,而不是在实际代码中。

标签: routes sinatra


【解决方案1】:

显然这是我因 Chrome 而遇到的问题(请参阅https://groups.google.com/forum/?fromgroups=#!topic/nodejs/A415fHudhhM

Chrome,只要它没有得到 favicon.ico 的正确响应,就会发送另一个请求,这与我过于通用的路由 /:id

添加一个favicon.ico(即使是空的)到项目根目录下的public文件夹修复了这个问题,因为现在 chrome 在请求 favicon 时会得到 200 响应。使用 firefox 从一开始就没有出现此错误的迹象。

【讨论】:

  • 很高兴您得到了答复。我在运行 Safari 时没有遇到这个问题,所以这不是 webkit 的问题。
【解决方案2】:

尝试编写不带斜杠的路线。 (更多信息请参见this page of the Sinatra FAQ

【讨论】:

  • 打错字了,后面没有斜线,只有get '/:id'
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-18
  • 1970-01-01
  • 2011-07-02
  • 1970-01-01
  • 2020-09-13
相关资源
最近更新 更多