小编Mas*_*ano的帖子

Rails 6 中 Logger 和 ActiveSupport::Logger 之间的区别

Rails(具体来说,Rails 6)定义了 ActiveSupport::Logger,根据文档和源代码,它似乎是Logger(Ruby 标准库之一)的包装器。

\n

然而,在截至 2020 年 10 月的 Rails 6.0当前官方 Rails 参考中,配置文件中使用了标准 Logger。(也许它曾经是 ActiveSupport::Logger?)

\n

现在,我想在log/development.log配置文件中指定与默认(在开发环境中)不同的日志文件文件名(例如,config/environments/development.rb)。做

\n
config.logger = Logger.new(\'log/my_log_file.log\')\n
Run Code Online (Sandbox Code Playgroud)\n

够了吗?或者,使用 ActiveSupport::Logger 更好吗?如果是这样,有什么区别?

\n

请注意,默认情况下,config/environments/development.rb没有定义有关日志文件名称的要遵循或修改的设置。不过,log/development.log它是在开发环境中自动创建的,因此必须在某个不起眼的地方定义它。

\n

[编辑]这个答案暗示了我的表达方式。我确认它似乎适用于我的环境。但没有推理为什么so\xe2\x80\xa6 ActiveSupport::Logger是错误的?

\n

ruby logging ruby-on-rails

8
推荐指数
1
解决办法
3404
查看次数

如何将 Regexp.last_match 传递给 Ruby 中的块

有没有办法将最后一个匹配(实际上Regexp.last_match)传递给 Ruby 中的块(迭代器)?

\n\n

Srring#sub这是一个示例方法,作为演示该问题的一种包装器。它接受标准参数和块:

\n\n
def newsub(str, *rest, &bloc)\n  str.sub(*rest, &bloc)\nend\n
Run Code Online (Sandbox Code Playgroud)\n\n

它适用于标准的仅参数情况,并且可以占用一个块;然而,像 $1、$2 等位置特殊变量在块内不可用。这里有些例子:

\n\n
newsub("abcd", /ab(c)/, \'\\1\')        # => "cd"\nnewsub("abcd", /ab(c)/){|m| $1}      # => "d"  ($1 == nil)\nnewsub("abcd", /ab(c)/){$1.upcase}   # => NoMethodError\n
Run Code Online (Sandbox Code Playgroud)\n\n

该块的工作方式与String#sub(/..(.)/){$1}我认为的工作方式不同的原因与范围有关;特殊变量 $1、$2 等是局部变量(也是Regexp.last_match)。

\n\n

有什么办法可以解决这个问题吗?我想让该方法像 $1、$2 等在提供的块中可用的意义上newsub一样工作。String#sub

\n\n

编辑:根据过去的一些答案,可能没有办法实现这个\xe2\x80\xa6

\n

ruby regex iterator scope yield

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

Rails Button_to 因 W3C 验证器而失败

最近, Ruby-on-Rails 的输出button_to开始在W3C 验证中失败,返回的消息为:

\n
\n

具有隐藏值的 type 属性的输入元素不得具有值为 on 或 off 的 autocomplete 属性。

\n
\n

所以我想摆脱这个错误。

\n

button_toRails-7.0.4中View(ERB)中对应的语句是

\n
<%= button_to "Add Entry", new_article_path, form_class: "inline_form button_to",\n  method: :get, params: { a_token: "abc" } %>\n
Run Code Online (Sandbox Code Playgroud)\n

它会生成一个 HTML(简化的!):

\n
<!DOCTYPE html>\n<html lang="en"> <head> <meta charset="utf-8"> <title>My Title</title> </head>\n<body>\n <form class="inline_form button_to" method="get" action="/articles/new?locale=en">\n  <input type="submit" value="Add Entry" />\n  <input type="hidden" name="a_token" value="abc" autocomplete="off" />\n </form>\n</body>\n</html>\n
Run Code Online (Sandbox Code Playgroud)\n

如果我将其粘贴到W3C 验证器表单中,则会失败并显示上述消息。

\n

显然,W3C 验证器不喜欢带有 …

html forms ruby-on-rails w3c-validation

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

如何在 Rails 5 控制器测试中测试或绕过 Basic Auth

我想测试 Rails 5 中激活了基本身份验证的控制器。当前官方说明(截至 2018-10-14)中解释的方式由于某种原因不起作用。问答“在 Rails 2.2+ 中测试 HTTP 基本身份验证”对于 Rails 5 来说似乎太旧了(至少对于默认情况)。

这是重现该案例的简化示例。
我从全新安装的 Rails(最新稳定版 5.2.1)通过脚手架制作了一个文章模型和相关资源:

bin/rails g scaffold Article title:string content:text
Run Code Online (Sandbox Code Playgroud)

并按照官方指南为控制器添加了基本身份验证功能;那么 ArticlesController 就是这样的,它当然有效:

# /app/controllers/articles_controller.rb
class ArticlesController < ApplicationController
  http_basic_authenticate_with name: "user1", password: "pass"
  before_action :set_article, only: [:show, :edit, :update, :destroy]

  def index
    @articles = Article.all
  end
end
Run Code Online (Sandbox Code Playgroud)

官方指令解释测试基本身份验证的方式; 你request.headers['Authorization']setup控制器的测试文件中添加 块,我做了:

# /test/controllers/articles_controller_test.rb
require 'test_helper'

class ArticlesControllerTest < ActionDispatch::IntegrationTest
  setup do
    request.headers['Authorization'] = …
Run Code Online (Sandbox Code Playgroud)

ruby testng ruby-on-rails basic-authentication ruby-on-rails-5

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