小编Mic*_*ich的帖子

Ruby lambda文字语法

我对与该(更经典)lambda语法相对应的lambda文字语法有疑问:

lambda { |foo| }
Run Code Online (Sandbox Code Playgroud)

以下是否正确?

->(foo) {}
Run Code Online (Sandbox Code Playgroud)

谢谢.

ruby lambda

26
推荐指数
1
解决办法
9214
查看次数

强制所有收到的请求Content-Type为JSON

我实际上正在使用一个使用Rails 4的API.Content-Type如果客户端没有在Content-Type头文件中指定媒体类型,我想将请求设置为JSON .

为了获得该行为,我尝试before_action在我的添加中添加以下内容ApplicationController:

def set_request_default_content_type
  request.format = :json
end
Run Code Online (Sandbox Code Playgroud)

在我的RegistrationsController#create方法中,我有一个断点来检查一切是否正常.好吧,request.format诀窍不起作用,尽管设置的值application/json似乎控制器(或Rails内部)不会将接收到的请求的Content-Type视为JSON.

我使用以下正文进行了POST请求(并且没有Content-Type):

{"user" : {"email":"foobar@mail.net","password":"foobarfoo"}}
Run Code Online (Sandbox Code Playgroud)

通过Pry调试我看到:

 [2] api(#<V1::RegistrationsController>) _  request.format.to_s
 => "application/json"
 [3] api(#<V1::RegistrationsController>) _  params
 => {
       "action" => "create",
   "controller" => "v1/registrations"
 }
Run Code Online (Sandbox Code Playgroud)

这意味着Rails没有使用配置的request.format考虑我的请求Mime::JSON,而是使用Mime::ALL,因此它没有解析请求的JSON主体.:(

ruby api ruby-on-rails rails-api ruby-on-rails-4

13
推荐指数
1
解决办法
6474
查看次数

机架中间件和线程安全

我有一个我的Rails 4应用程序使用的自定义机架中间件.如果客户端没有提供有效信息(我正在使用API​​),中间件本身就是默认AcceptContent-Type标题application/json.因此,在每个请求之前,它会更改这些标头,并在每次请求之后添加一个自定义X-Something-Media-Type头,并带有自定义媒体类型信息.

我想切换到Puma,因此我有点担心这种中间件的线程安全性.我没有使用实例变量,除了一次@app.call我们在每个中间件中遇到的常见变量,但即使在这里我也复制了我在RailsCasts的评论中读到的内容:

def initialize(app)
 @app = app
end

def call(env)
 dup._call(env)
end

def _call(env)
 ...
 status, headers, response = @app.call(env)
 ...
Run Code Online (Sandbox Code Playgroud)

dup._call为了处理线程安全问题真的有用吗?

除了@app实例变量之外,我只使用当前env变量构建的当前请求:

request      = Rack::Request.new(env)
Run Code Online (Sandbox Code Playgroud)

我打电话env.update来更新标题和表单信息.

当我将切换Webrick到并发Web服务器时,如果期望中间件出现问题,这是否足够危险Puma

如果是的话,您是否知道一些方法可以进行一些测试以隔离我的中间件中非线程安全的部分?

谢谢.

ruby rack ruby-on-rails thread-safety puma

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

自定义中间件块引发异常的回溯

我需要一些建议。我正在开发我的第一个Rack中间件。但是,当从一个控制器引发一个异常时,我没有得到完整的异常回溯,因为我的中间件显然是最后一个可以使用的中间件:

NoMethodError (undefined method `accessible?' for "zFhY3ksiR4UdtGH3ZHs3":String):
   app/middleware/content_negotiation.rb:28:in `_call'
   app/middleware/content_negotiation.rb:20:in `call'
Run Code Online (Sandbox Code Playgroud)

而不是真正的回溯,即类似这样的东西:

[ 0] "/.../lib/doorkeeper/doorkeeper_for.rb:17:in `validate_token'",
[ 1] "/.../lib/doorkeeper/helpers/filter.rb:9:in `block in doorkeeper_for'",
Run Code Online (Sandbox Code Playgroud)

自定义中间件的第20行对应于:

 def call(env)
  dup._call(env)
 end
Run Code Online (Sandbox Code Playgroud)

第28行对应于_call

status, headers, response = @app.call(env)
Run Code Online (Sandbox Code Playgroud)

在这种情况下,使自定义中间件透明/无阻塞的最佳实践是什么?我应该从该中间件中解救出来并显示异常/回溯吗?

谢谢。

ruby rack ruby-on-rails

5
推荐指数
1
解决办法
229
查看次数