2017-02-12 35 views
0

我的开发环境中有一个工作正常的路由,但由于某种原因,它不适用于生产环境,我无法弄清楚原因。Rails在开发和生产中的路由有所不同

当我在我的开发环境中使用http://localhost:3000/api/v1/register_panelist?api_key=ff4a6fa1c975693bedc2122e6943946b时,它工作的很好。

但是,当我去http://example.com/api/v1/register_panelist?api_key=ff4a6fa1c975693bedc2122e6943946b它不解决,并最终落入“寻找页面”,这是在我的路线文件的底部捕获所有路线。

在我routes.rb文件我有这样的:

constraints(ApiConstraint) do 

    namespace :api, defaults: {format: 'json'} do 
    namespace :v1, defaults: {format: 'json'} do 

     match "register_panelist", to: "appusers#register_panelist", via: 'get' 
     match "get_surveys", to: "appusers#get_surveys", via: 'get'  

    end 
    end 

    match "api/v1/*path", to: "api/v1/misc#api_not_found_404", via: :all, format: 'json' 
end 

... 
#at the very bottom 
match "*path", to: "static_pages#not_found_404", via: :all, format: false #, :constraints => {:format => [:html, :png]} 

在我的开发环境,它似乎正确解析。但在制作中,它似乎正在落到routes.rb文件的底部。

任何想法为什么?

编辑:添加日志:

生产:

production.log — I, [2017-02-12T11:55:31.455331 #27545] INFO -- : Started GET "/api/v1/register_panelist.json?api_key=ff4a6fa1c975693bedc2122e6943946b&country_id=9&birthday_year=1989&birthday_month=2&birthday_day=16&gender=42198&hispanic=42200&zip=10022&state=45700&ethnicity=42215&standard_relationship=42232&standard_education=42243&standard_hhi_us=43511" for 75.100.38.224 at 2017-02-12 11:55:31 +0000 
production.log — I, [2017-02-12T11:55:31.606946 #27545] INFO -- : Prod? true 
production.log — I, [2017-02-12T11:55:31.607886 #27545] INFO -- : subdomain: 
production.log — I, [2017-02-12T11:55:31.607948 #27545] INFO -- : protocol: https:// 
production.log — I, [2017-02-12T11:55:31.608020 #27545] INFO -- : Prod? true 
production.log — I, [2017-02-12T11:55:31.608052 #27545] INFO -- : subdomain: 
production.log — I, [2017-02-12T11:55:31.608086 #27545] INFO -- : protocol: https:// 
production.log — I, [2017-02-12T11:55:31.617812 #27545] INFO -- : Processing by StaticPagesController#not_found_404 as HTML 
production.log — I, [2017-02-12T11:55:31.617925 #27545] INFO -- : Parameters: {"api_key"=>"ff4a6fa1c975693bedc2122e6943946b", "country_id"=>"9", "birthday_year"=>"1989", "birthday_month"=>"2", "birthday_day"=>"16", "gender"=>"42198", "hispanic"=>"42200", "zip"=>"10022", "state"=>"45700", "ethnicity"=>"42215", "standard_relationship"=>"42232", "standard_education"=>"42243", "standard_hhi_us"=>"43511", "path"=>"api/v1/register_panelist.json"} 
production.log — I, [2017-02-12T11:55:31.636463 #27545] INFO -- : Rendered text template (0.2ms) 
production.log — I, [2017-02-12T11:55:31.636883 #27545] INFO -- : Completed 404 Not Found in 19ms (Views: 11.4ms | ActiveRecord: 0.0ms) 

发展:

api_v1_register_panelist GET /api/v1/register_panelist(.:format)               api/v1/appusers#register_panelist {:format=>"json"} 
            api_v1_get_surveys GET /api/v1/get_surveys(.:format)                 api/v1/appusers#get_surveys {:format=>"json"} 

Started GET "/api/v1/register_panelist?api_key=ff4a6fa1c975693bedc2122e6943946b&country_id=9&birthday_year=1989&birthday_month=2&birthday_day=16&gender=42198&hispanic=42200&zip=53593&state=45700&ethnicity=42215&standard_relationship=42232&standard_education=42243&standard_hhi_us=43511" for ::1 at 2017-02-12 05:56:46 -0600 
Prod? false 
subdomain: 
protocol: http:// 
Processing by Api::V1::AppusersController#register_panelist as JSON 
    Parameters: {"api_key"=>"ff4a6fa1c975693bedc2122e6943946b", "country_id"=>"9", "birthday_year"=>"1989", "birthday_month"=>"2", "birthday_day"=>"16", "gender"=>"42198", "hispanic"=>"42200", "zip"=>"53593", "state"=>"45700", "ethnicity"=>"42215", "standard_relationship"=>"42232", "standard_education"=>"42243", "standard_hhi_us"=>"43511"} 
    User Load (18.7ms) SELECT "users".* FROM "users" WHERE "users"."api_key" = $1 ORDER BY "users"."id" ASC LIMIT 1 [["api_key", "ff4a6fa1c975693bedc2122e6943946b"]] 

rake routes从开发输出

和生产服务器:

api_v1_register_panelist GET /api/v1/register_panelist(.:format)               api/v1/appusers#register_panelist {:format=>"json"} 
            api_v1_get_surveys GET /api/v1/get_surveys(.:format)                 api/v1/appusers#get_surveys {:format=>"json"} 
+0

你可以共享dev&prod的请求日志吗? – Abhishek

回答

1

我猜想,有一些是在被篡夺请求之前它被传递到铁轨(国防部重写等)的网络服务器配置,或者挂载点设置你的Web服务器中的Rails执行环境(例如Nginx中的Unicorn,Apache中的Passenger),或者可能是由WEBrick和您的实时服务器以不同方式处理的中间件。

无论如何,我会通过检查服务器上的路线开始:

rake routes 

,并确保他们是你的期望。接下来,检查rails日志并确认请求实际上是由Rails处理的,而不是被Web服务器或某些中间件拦截。如果你将日志级别调试到调试,它应该详细说明它如何处理它。这应该至少给你下一步看什么。

+0

我试着将日志级别调高到':debug'并发布了生产结果。它实际上看起来与':info'具有相同的输出量。任何聪明的想法? –

+0

@TomHammond - 确保您在更改后重新启动,您已将其设置在正确的环境中,并且您的应用程序实际上在您认为是的环境中运行(可能是“生产”)。 – jpgeek

+0

@TomHammond - 查看上面的日志,请求是不同的。用于开发的是调用/ api/v1/register_panelist?api_key = ff4a6f ...但生产中的一个调用api/v1/register_panelist.json?api_key = ff4a ....所以这种格式在开发时缺失。 至于下面的结果,我绝对不会这样 - 我会找到实际的问题。留下两次输入的相同路线将在周日凌晨2点困扰您,并带来难以调试的问题。 – jpgeek

0

我还不能肯定为什么这个作品,但似乎我不得不更新我的routes.rb文件两次调出该行 - 的限制范围内,一旦找到我的开发环境的路由,而一旦没有被发现生产:

constraints(ApiConstraint) do 

    namespace :api, defaults: {format: 'json'} do 
    namespace :v1, defaults: {format: 'json'} do 

     #find in development 
     match "register_panelist", to: "appusers#register_panelist", via: 'get' 
     match "get_surveys", to: "appusers#get_surveys", via: 'get'  

    end 
    end 

    match "api/v1/*path", to: "api/v1/misc#api_not_found_404", via: :all, format: 'json' 
end 

#find in production 
match "api/v1/register_panelist", to: "api/v1/appusers#register_panelist", via: 'get' 
match "api/v1/get_surveys", to: "api/v1/appusers#get_surveys", via: 'get' 
+0

我刚碰到这个完全相同的问题。任何关于为什么会发生这种情况 – KenneyE

+0

不知道我曾经弄明白过。再看一下代码 - 命名空间似乎在开发版中具有json格式,而不是在生产版中。所以也许可以做些什么(即使json仍然在生产版本中返回)...嗯。 –

+0

经过深入挖掘,我发现这个问题https://github.com/rails/rails/issues/5798,这可能会解释它。看起来这个问题只适用于你的命名空间是ActiveRecord模型的情况,但是我怀疑你有一个名为'Api'或'V1'的模型,所以我不确定.... – KenneyE

相关问题