标签: actiondispatch

Rails 5.1:"unknown firstpos:NilClass" - 问题重装应用程序

在此输入图像描述

从Rails 5.0升级到5.1后,我会在应用程序重新加载时收到此错误,无论是从代码更改期间rails server还是reload!从控制台调用.

 13:53$ rc
Loading development environment (Rails 5.1.1)
2.3.1 :001 > reload!
Reloading...
ArgumentError: unknown firstpos: NilClass
    from (irb):1
2.3.1 :002 > 
Run Code Online (Sandbox Code Playgroud)

https://github.com/rails/rails/blob/master/actionpack/lib/action_dispatch/journey/gtg/builder.rb

应用程序跟踪为空,这是框架跟踪:

actionpack (5.1.1) lib/action_dispatch/journey/gtg/builder.rb:99:in `firstpos'
actionpack (5.1.1) lib/action_dispatch/journey/gtg/builder.rb:22:in `transition_table'
actionpack (5.1.1) lib/action_dispatch/journey/routes.rb:58:in `simulator'
actionpack (5.1.1) lib/action_dispatch/journey/router.rb:92:in `simulator'
actionpack (5.1.1) lib/action_dispatch/journey/router.rb:28:in `eager_load!'
actionpack (5.1.1) lib/action_dispatch/routing/route_set.rb:382:in `eager_load!'
railties (5.1.1) lib/rails/application/routes_reloader.rb:26:in `each'
railties (5.1.1) lib/rails/application/routes_reloader.rb:26:in `execute'
railties (5.1.1) lib/rails/application/finisher.rb:141:in `block (2 levels) in <module:Finisher>'
activesupport (5.1.1) lib/active_support/callbacks.rb:413:in `instance_exec'
activesupport (5.1.1) lib/active_support/callbacks.rb:413:in `block in make_lambda' …
Run Code Online (Sandbox Code Playgroud)

ruby-on-rails actiondispatch ruby-on-rails-5.1

40
推荐指数
3
解决办法
3852
查看次数

在某些RSpec rails请求示例中测试HTTP状态代码,但是对于其他RSPro rails请求示例

在测试的Rails 4.2.0应用程序中rspec-rails,我提供了一个JSON Web API,它具有类似REST的资源,具有强制属性mand_attr.

我想测试一下,BAD REQUEST当POST请求中缺少该属性时,此API会回答HTTP代码400().(请参阅第二个示例.)我的控制器尝试通过抛出一个来生成此HTTP代码ActionController::ParameterMissing,如下面的第一个RSpec示例所示.

其他 RSpec示例中,我希望通过示例(如果它们是预期的)挽救引发的异常或者命中测试运行器,因此它们会显示给开发人员(如果错误是意外的),因此我不想要去除

  # Raise exceptions instead of rendering exception templates.
  config.action_dispatch.show_exceptions = false
Run Code Online (Sandbox Code Playgroud)

来自config/environments/test.rb.

我的计划是在请求规范中包含以下内容:

describe 'POST' do
  let(:perform_request) { post '/my/api/my_ressource', request_body, request_header }
  let(:request_header) { { 'CONTENT_TYPE' => 'application/json' } }

  context 'without mandatory attribute' do
    let(:request_body) do
      {}.to_json
    end

    it 'raises a ParameterMissing error' do
      expect { perform_request }.to raise_error ActionController::ParameterMissing,
                                                'param is missing or the value …
Run Code Online (Sandbox Code Playgroud)

ruby rspec ruby-on-rails rspec-rails actiondispatch

19
推荐指数
2
解决办法
4401
查看次数

ActionDispatch :: Routing :: RouteSet#调用Rails 4.1真的很慢

我搜索了几天但找不到这个问题的任何相关答案.

在Heroku上托管的我的Rails 4.1应用程序中,当负载增加时,一些PUT请求变得非常慢.今天最慢的是53秒.所有没有数据库(MongoDB)注册任何慢查询.通常这个请求需要0.3ms这么快.无论有效载荷是什么,请求都很慢.

在安装New Relic后,它更清楚了解情况,但我仍然不知道在哪里解决这个问题.

控制器中的代码很快,但根据New Relic,速度慢的是ActionDispatch :: Routing :: RouteSet #call

这是New Relic报道的转储:

Slowest components                      Count   Duration    %
ActionDispatch::Routing::RouteSet#call  1   53,000 ms   100%
Plugin::FetchablesController#update     1   38 ms       0%
Rails::Rack::Logger#call                1   1 ms        0%
ActionDispatch::Cookies#call            1   1 ms        0%
ActiveSupport::Cache::Strategy::LocalCache::Middleware#call 1   0 ms    0%
Rack::Runtime#call                      1   0 ms        0%
Total                                       53,000 ms   100%
Run Code Online (Sandbox Code Playgroud)

其他一些可能有帮助或可能与此有关的信息.我有路由的别名,但我不明白为什么这很重要.

namespace :plugin do
   resources :fetchables, path: :minables
end
Run Code Online (Sandbox Code Playgroud)

任何有关可能发生的事情以及我可以做些什么来修复它的想法都将不胜感激.

更新 所以它似乎与内存有关.当我们升级到Performance Dynos时,我们已经停止看到这些错误.但这似乎是Heroku严重错误配置的东西.

ruby-on-rails heroku mongodb actiondispatch ruby-on-rails-4.1

17
推荐指数
1
解决办法
1664
查看次数

使用Rails 4.0进行自定义错误处理

我正在使用Ruby 2.0和Rails 4.0构建Ruby on Rails api.我的应用程序几乎只是一个JSON API,所以如果发生错误(500,404),我想捕获该错误并返回格式良好的JSON错误消息.

我试过这个并且还:

rescue_from ActionController::RoutingError, :with => :error_render_method

def error_render_method
  puts "HANDLING ERROR"
  render :json => { :errors => "Method not found." }, :status => :not_found
  true
end
Run Code Online (Sandbox Code Playgroud)

在我的ApplicationController中.

这些都没有做到这一点(根本没有捕获例外).我的谷歌搜索显示这在3.1,3.2之间发生了很大变化,我找不到任何关于如何在Rails 4.0中做到这一点的好文档.

有人知道吗?

编辑 这是我进入404页面时的堆栈跟踪:

Started GET "/testing" for 127.0.0.1 at 2013-08-21 09:50:42 -0400

ActionController::RoutingError (No route matches [GET] "/testing"):
actionpack (4.0.0) lib/action_dispatch/middleware/debug_exceptions.rb:21:in `call'
actionpack (4.0.0) lib/action_dispatch/middleware/show_exceptions.rb:30:in `call'
railties (4.0.0) lib/rails/rack/logger.rb:38:in `call_app'
railties (4.0.0) lib/rails/rack/logger.rb:21:in `block in call'
activesupport (4.0.0) lib/active_support/tagged_logging.rb:67:in `block in tagged' …
Run Code Online (Sandbox Code Playgroud)

json ruby-on-rails actiondispatch ruby-2.0 ruby-on-rails-4

15
推荐指数
4
解决办法
1万
查看次数

Rails 4.2服务器; 私人和公共IP无法正常工作

我最近将rails 4.1.8更新为4.2

我无法使用私有IP 192.168.1.x:3000和我的访问使用rails应用程序public-ip address.

Rails应用程序正在与lvh.me:3000,0.0.0.0:3000,localhost:3000127.0.0.1:3000.但它看起来所有的地址都指向127.0.0.1:3000我的服务器日志rails-issue.

它在4.1中运行良好

我尝试添加以下内容environments/development.rb,但没有任何改变.

TRUSTED_PROXIES = %r{
  ^127\.0\.0\.1$                | # localhost
  ^(10                          | # private IP 10.x.x.x
    172\.(1[6-9]|2[0-9]|3[0-1]) | # private IP in the range 172.16.0.0 .. 172.31.255.255
    192\.168                      # private IP 192.168.x.x
   )\.
}x

config.action_dispatch.trusted_proxies = /^127\.0\.0\.1$/ # localhost
Run Code Online (Sandbox Code Playgroud)

我试图将我的本地服务器指向公共IP地址.我已经将端口转发配置为在公共地址中访问.

rack actiondispatch ruby-on-rails-4

11
推荐指数
1
解决办法
5127
查看次数

Rails:从日志中过滤JSON参数中的敏感数据

我正在运行Rails 3并尝试从我们的日志中过滤敏感信息,这些日志是作为post参数传递的JSON blob.例如,用户创建可能会使用user作为JSON对象的字符串值调用post param .JSON对象中的一个键是password,我们想要从日志中过滤掉它.我发现这样做的最好方法是在filter_params中添加一个块,如下所示:

keys_to_filter = ['password', 'password_confirmation']
config.filter_parameters << lambda do |k,v|
  if v.is_a? String
    keys_to_filter.each do |key|
      # Match "key":"<filter_out>", or "key":"<filter_out>"}, allowing for whitespace
      v.sub!(/("\s*#{key}\s*")\s*:\s*"[^,\}]*"\s*([,\}])/, "\\1:\"[FILTERED]\"\\2")
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

这会向filter_params添加一个块,这会导致另一个问题中描述的错误:Rails:ParameterFilter :: compiled_filter尝试重复符号

将块传递给filter_parameters似乎是不安全的,所以我想知道是否有另一种方法可以解决这个问题.

security json ruby-on-rails actiondispatch ruby-on-rails-3

10
推荐指数
1
解决办法
2107
查看次数

基于已安装的引擎,使用url_for获取基于约束的url

有什么办法可以让url_for在动作调度路由期间根据request.host返回url?

mount Collaborate::Engine => '/apps/collaborate', :constraints => {:host => 'example.com' }
mount Collaborate::Engine => '/apps/worktogether'
Run Code Online (Sandbox Code Playgroud)

例:

当用户在example.com主机上时

collaborate_path =>/apps/collaborate

当用户在任何其他主机上时

collaborate_path =>/apps/worktogether

经过大量的研究,我意识到RouteSet类有name_routes,它不考虑返回url的约束.

我已经尝试在action_dispatch/routing/route_set.rb中覆盖@set以从rails应用程序中取出但是dint按预期工作

@search_set = Rails.application.routes.set.routes.select{|x| x.defaults[:host] == options[:host] }[0]
@set = @search_set unless @search_set.blank?
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails actiondispatch ruby-on-rails-4

10
推荐指数
2
解决办法
399
查看次数

什么是ActionDispatch?

我对基本的Rails概念(如ActiveRecord,路由,迁移等)有一个相当不错的把握.我很难理解的一件事是ActionDispatch.我找不到简单的英文描述(或任何描述).那是什么?

ruby-on-rails actiondispatch

9
推荐指数
2
解决办法
5312
查看次数

Rails,如何在绝对最低级别访问原始请求数据?

Rails request对象何时在请求生命周期中的最早时间可用?基本上,什么时候请求首先作为请求对象可用,以及在哪个对象中?ActionDispatch

你能从中访问请求参数Tester::Application吗?如果是这样,怎么样?如果没有,那么使用环境呢?该信息何时设定?

lifecycle ruby-on-rails request actiondispatch

7
推荐指数
1
解决办法
7383
查看次数

覆盖嵌套路径中的参数

我希望在路由的命名约定方面保持一致.默认参数适用:id于任何资源.但是,如果在其中嵌套另一个资源,父资源的参数将更改为:parent_id.我的路由看起来像:

resources :users do
  resources :projects do
    resources :issues
  end
end
Run Code Online (Sandbox Code Playgroud)

对于用户模型,它会生成url :id,对于项目url将是:user_id/:id和url将发生的问题:user_id/:project_id/:id.我试图重载以下默认PARAM

resources :users, param: :user_id do
  resources :projects, param: :project_id do
    resources :issues, param: :issue_id
  end
end
Run Code Online (Sandbox Code Playgroud)

它生成的URL如下::user_user_id/:project_project_id/:issue_id.由于我重写它,我希望父资源的默认附加是关闭的.我希望我的路线看起来像:user_id/:project_id/:issue_id我希望它对所有模型都一致.即项目应映射到:user_id/:project_id.

routing ruby-on-rails actiondispatch

7
推荐指数
2
解决办法
1164
查看次数