Tag: actiondispatch

Rail 5交换带有自定义重新加载器的ActionDispatch :: Reloader

我们有一个用例,用于在本地开发时将模拟引擎安装到进程会话,其中自定义会话中间件在请求通过时通过Net :: http请求调用模拟引擎。 当代码更改时,会触发重新加载器,并在此处调用ActiveSupport::Dependencies以开始卸载。 然后请求传递给我们的自定义会话中间件,并触发http请求。 但是,由于http请求调用可安装的引擎,它再次认为是相同的中间件,并且重新加载器再次卸载所有依赖项,这导致第一次重新加载超时。 因此,目标是能够跳过第二个请求的重新加载。 我在这里向ActionDispatch::Reloader添加了以下代码,它完全符合我的要求。 class Reloader < Executor def initialize(app, executor) super(app, executor) end def call(env) request = ActionDispatch::Request.new(env) return @app.call(env) if skip_request?(request) super(env) end def skip_request?(request) request.path_info.start_with?('/session') end end 然后我想让这个更干净的想法完全把它拉出来一个模块,然后从初始化器中做这样的交换 app.config.middleware.swap(::ActionDispatch::Reloader, MyModule::CustomReloaderMiddleware) 这是模块 require ‘action_dispatch’ module MyModule class CustomReloaderMiddleware < ActionDispatch::Executor def initialize(app, executor) @app, @executor = app, executor end […]

你如何使用ActionDispatch :: Routing :: RouteSet recogn_path?

你如何使用ActionDispatch :: Routing :: RouteSet recogn_path? 我想获取视图的当前路径。 我尝试了<div id="”>但是获得了ActionDispatch :: Routing :: RouteSet:Class的“未定义方法`recogn_path’”。 谢谢!

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

我正在运行Rails 3并尝试从我们的日志中过滤敏感信息,这些日志是作为post参数传递的JSON blob。 例如,用户创建可能会使用一个名为user的post param,其字符串值是JSON对象。 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":"”, or “key”:””}, allowing for whitespace v.sub!(/(“\s*#{key}\s*”)\s*:\s*”[^,\}]*”\s*([,\}])/, “\\1:\”[FILTERED]\”\\2”) end end end 这会向filter_params添加一个块,这会导致另一个问题中描述的错误: Rails:ParameterFilter :: compiled_filter尝试重复符号 将块传递给filter_parameters似乎是不安全的,所以我想知道是否有另一种方法可以解决这个问题。

覆盖嵌套路径中的参数

我希望在路由的命名约定方面保持一致。 默认参数是:id任何资源的:id 。 但是,如果在其中嵌套另一个资源,父资源的参数将更改为:parent_id 。 我的路由看起来像: resources :users do resources :projects do resources :issues end end 对于用户模型,它将生成url,如:id ,对于项目url将为:user_id/:id ,对于问题,url将为:user_id/:project_id/:id 。 我试图在此之后重载默认参数 resources :users, param: :user_id do resources :projects, param: :project_id do resources :issues, param: :issue_id end end 它生成的URL类似于:: :user_user_id/:project_project_id/:issue_id 。 由于我重写它,我希望父资源的默认附加是关闭的。 我希望我的路由看起来像:user_id/:project_id/:issue_id ,我希望它对所有模型都是一致的。 即项目应映射到:user_id/:project_id 。

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 […]

使用Rails 4.0进行自定义error handling

我正在使用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 在我的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”): […]

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

在使用rspec-rails测试的Rails 4.2.0应用程序中,我提供了一个带有类似REST资源的JSON Web API,其强制属性为mand_attr 。 我想测试一下,当POST请求中缺少该属性时,此API会回答HTTP代码400( BAD REQUEST )。 (请参阅第二个示例。)我的控制器尝试通过抛出ActionController::ParameterMissing来生成此HTTP代码,如下面的第一个RSpec示例所示。 在其他 RSpec示例中,我希望通过示例(如果它们是预期的)挽救引发的exception或者命中测试运行器,因此它们会显示给开发人员(如果错误是意外的),因此我不想要去除 # Raise exceptions instead of rendering exception templates. config.action_dispatch.show_exceptions = false 来自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 […]

Rails:ParameterFilter :: compiled_filter尝试复制符号

我正在运行带有rails exception-notifier gem的rails3。 当发生exception,并且应该发送电子邮件时,我从ParameterFilter类中获得exception。 我在rails源中发现了这个问题,我不确定最好的方法。 问题发生在ActionDispatch :: Http :: ParameterFilter中。 在compiled_filter方法中,第38行发生错误: key = key.dup当key是符号时,因为符号不可复制。 这是来源: def compiled_filter … elsif blocks.present? key = key.dup value = value.dup if value.duplicable? blocks.each { |b| b.call(key, value) } end 我看到它们只有在可duplicable时才调用dup value 。 如果我修补源只能在key可duplicable时调用key ,那么我的问题就会消失。 我假设有一个原因让作者把这个条件放在value而不是key ,所以我很好奇是否有人对这个代码有了更好的理解。 只有在application.rb中向filter参数添加块时才会出现此错误。 所以,也许我的原始问题有一个解决方法,不需要在这里使用块。 如果您有兴趣,请参阅我的同事的问题Rails:从日志中过滤JSON参数中的敏感数据 这是一个问题的关键是:action 。 这来自rails,我不知道是否有任何方法可以强制它成为字符串。 我提交了一个rails bug https://rails.lighthouseapp.com/projects/8994/tickets/6557-symbol-duplication-error-in-parameterfilter-compiled_filter我准备好了补丁,如果key.duplicable? 到key.dup行,我正在寻找关于这是否是正确解决方案的输入。