从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) 在测试的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) 我搜索了几天但找不到这个问题的任何相关答案.
在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
我正在使用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) 我最近将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:3000和127.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地址.我已经将端口转发配置为在公共地址中访问.
我正在运行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似乎是不安全的,所以我想知道是否有另一种方法可以解决这个问题.
有什么办法可以让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) 我对基本的Rails概念(如ActiveRecord,路由,迁移等)有一个相当不错的把握.我很难理解的一件事是ActionDispatch.我找不到简单的英文描述(或任何描述).那是什么?
Rails request对象何时在请求生命周期中的最早时间可用?基本上,什么时候请求首先作为请求对象可用,以及在哪个对象中?ActionDispatch?
你能从中访问请求参数Tester::Application吗?如果是这样,怎么样?如果没有,那么使用环境呢?该信息何时设定?
我希望在路由的命名约定方面保持一致.默认参数适用: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.