小编Tsu*_*omu的帖子

在Ruby on Rails中采用"不断增长的面向对象软件"技术

我阅读了Steve Freeman和Nat Pryce 的测试指导下的面向对象的软件,并给我留下了深刻的印象.我想在使用RSpec的Rails项目中采用本书的思想,尽管它的例子是用Java编写的.

本书的基本原则是我们应该模拟接口而不是具体的类.他们说我们可以通过提取接口并命名它们来改进应用程序设计.

但是,Ruby没有任何与Java相同的语法interface.我如何利用他们的技术进行Rails项目?

UPDATE

例如,在页面126中,作者引入了Auction接口以实现该bid方法.首先,他们嘲笑Auction.class让测试通过,然后他们在Auction类中实现了一个类作为匿名内部Main类.最后,他们XMPPAuctionMain(第131-132页)中提取了一个新的具体类.

在我看来,这种增量方法是本书的关键.

如何在Ruby开发中采用或模仿这样一系列代码转换?

ruby rspec interface mocking

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

如何防止Rails控制器生成器修改config/routes.rb

有时我会运行一个命令rails g controller foo index来生成控制器和模板的骨架.

因为我不希望每个控制器都有帮助器和资产,所以我将以下代码放入config/application.rb:

config.generators do |g|
  g.helper false
  g.assets false
end

还有一件事我不想发生.生成器get "foo/index"为我添加了一行config/routes.rb.我该怎样预防呢?

ruby ruby-on-rails generator

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

链轮在找到v3.3.4时找不到bootstrap v3.3.5

我正在开发一个Rails应用程序(v4.2.1),它上面安装了一个引导程序vendor/assets/components/bootstrap.

事情进展顺利,直到我将引导程序从v3.3.4升级到v3.3.5.

现在我看到一个错误页面couldn't find file 'bootstrap' with type 'text/css'.

这是我的app/assets/stylesheets/application.css:

/*
 *= require_tree .
 *= require bootstrap
 *= require fontawesome
 *= require_self
 */
Run Code Online (Sandbox Code Playgroud)

如果我将引导程序降级到v3.3.4,则此错误消失.有什么建议吗?

[UPDATE]

我用bower install命令安装了boostrap .以下是我的.bowerrc:

{
  "directory": "vendor/assets/components"
}

我有一个像这样的目录树:

vendor
  + assets
    + components
      + bootstrap
        + dist
        + fonts
        + grunt
        + js
        + less
        + .bower.json
        + ...

链轮的版本是3.2.0.我也使用sprockets-rails 2.3.2和sprockets-es6 0.6.2.

sprockets twitter-bootstrap-3

9
推荐指数
1
解决办法
380
查看次数

Elixir中函数参数中的等号是什么?

我已经定义了Foo这样一个模块:

defmodule Foo do
  def hello(x = %{name: name}) do
    IO.inspect [x, name]
  end
end
Run Code Online (Sandbox Code Playgroud)

如果我运行Foo.hello(%{name: "Alice"}),我得到以下结果:

[%{name: "Alice"}, "Alice"]
Run Code Online (Sandbox Code Playgroud)

然后,我了解到我可以在Foo不改变其功能的情况下重写模块:

defmodule Foo do
  def hello(%{name: name} = x) do
    IO.inspect [x, name]
  end
end
Run Code Online (Sandbox Code Playgroud)

为什么这是可能的?函数参数中的等号是什么?它是普通的匹配算子吗?

根据我的理解,操作员=将右侧的值与左侧的图案进行匹配.

[编辑]

看完贾斯汀的回答后,我自己发了一个答案.但是,我仍然需要帮助.

我想知道=运算符在函数头中是否表现不同以及为什么.

如果可以的话,我想找一份官方文件.

elixir

6
推荐指数
1
解决办法
589
查看次数

Elixir:如何处理未在最后的默认参数?

当我运行以下 Elixir 脚本时,它会打印出{"K", "Y", "L"}.

defmodule MyMod do
  def make_tuple(a \\ "X", b \\ "Y", c) do
    {a, b, c}
  end
end

IO.inspect(MyMod.make_tuple("K", "L"))
Run Code Online (Sandbox Code Playgroud)

为什么不输出{"X", "K", "L"}?这种行为背后的机制是什么?

elixir

6
推荐指数
2
解决办法
98
查看次数

活动存储引发ActiveSupport :: MessageVerifier :: InvalidSignature

为了使用Active Storage将图像文件导入Rails应用程序,我编写了一个Rake,如下所示:

task :import_file => :environment do
  path = Rails.root.join("tmp", "sample.jpg")
  data = File.read(path)

  post = Post.first
  post.image.attach(data)
end
Run Code Online (Sandbox Code Playgroud)

执行此任务时,出现Exception ActiveSupport::MessageVerifier::InvalidSignature

如何避免此错误?

Post模型的源代码为:

class Post < ApplicationRecord
  has_one_attached :image
end
Run Code Online (Sandbox Code Playgroud)

我使用默认值config/storage.yml

test:
  service: Disk
  root: <%= Rails.root.join("tmp/storage") %>

local:
  service: Disk
  root: <%= Rails.root.join("storage") %>
Run Code Online (Sandbox Code Playgroud)

Rails的版本是5.2.0.beta2。

ruby-on-rails rails-activestorage

5
推荐指数
2
解决办法
3103
查看次数

ActiveStorage:在所有者记录被销毁后分离(而不是清除)附件?

Rails API 文档说明了以下关于has_many_attachedhas_one_attched方法的内容:

如果 :dependent 选项未设置,则每当记录被销毁时,所有附件都将被清除(即销毁)。

具体来说,我应该为这个选项指定什么值?

ruby-on-rails rails-activestorage

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

为什么Erlang允许原子包含裸@符号?它有实际用途吗?

Erlang官方用户指南(http://erlang.org/doc/reference_manual/data_types.html#id67942)说:

如果原子不是以小写字母开头,或者如果它包含除字母数字字符,下划线(_)或@之外的其他字符,则用单引号(')括起来.

为什么Erlang允许原子包含裸@符号?它是否具有实际用途或任何历史意义?

erlang

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

Elixir Mix 版本 - 如何将额外的文件复制到 Phoenix 应用程序的 tarball 中?

我编写了以下 mix.ex 以将我的 Phoenix 应用程序作为 tar 球发布,请参阅 Mix.Tasks.Release 文档的 \xe2\x80\x9cSteps\xe2\x80\x9d部分

\n
defmodule MyApp.MixProject do\n  use Mix.Project\n\n  def project do\n    [\n      apps_path: "apps",\n      apps: [:shared, :admin, :shop],\n      version: "0.1.0",\n      start_permanent: Mix.env() in [:qa, :prod],\n      deps: deps(),\n      releases: [\n        my_app: [\n          applications: [\n            admin: :permanent,\n            shop: :permanent\n          ],\n          steps: [:assemble, &copy_extra_files/1, :tar]\n        ]\n      ],\n      default_release: :my_app\n    ]\n  end\n\n  defp copy_extra_files(release) do\n    File.cp_r("apps/shared/priv/repo/seeds", release.path <> "/seeds")\n    release\n  end\n\n  defp deps do\n    []\n  end\nend\n
Run Code Online (Sandbox Code Playgroud)\n

当我运行 时MIX_ENV=qa mix release my_app,它 …

elixir-mix elixir phoenix-framework

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

Terraform GCP:如何将 MIG 连接到后端服务?

为了创建 HTTP 负载均衡器,我创建了以下.tf文件:

resource "google_compute_instance_group_manager" "nginx" {
  name = "nginx-igm"

  base_instance_name = "nginx"
  zone               = var.zone

  version {
    instance_template = google_compute_instance_template.nginx.id
  }

  target_size  = 2

  auto_healing_policies {
    health_check      = google_compute_health_check.autohealing.id
    initial_delay_sec = 300
  }
}

resource "google_compute_health_check" "autohealing" {
  name        = "autohealing"
  description = "Autohealing health check via http"

  timeout_sec         = 5
  check_interval_sec  = 5
  healthy_threshold   = 2
  unhealthy_threshold = 2

  http_health_check {
    response = "<!DOCTYPE html>"
  }
}

resource "google_compute_instance_template" "nginx" {
  name        = "nginx-template"
  description = …
Run Code Online (Sandbox Code Playgroud)

terraform terraform-provider-gcp

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

如何等待Elixir衍生过程像Ruby的Thread#join一样结束

我有以下Ruby代码:

t = Thread.new do
  sleep(1)
  puts "Finished!"
end

t.join
Run Code Online (Sandbox Code Playgroud)

如何在Elixir中编写等效代码?

我写了以下一篇:

spawn fn ->
  :timer.sleep(1000)
  IO.puts "Finished!"
end

:timer.sleep(1000)
Run Code Online (Sandbox Code Playgroud)

它可以工作,但这不等同于Ruby版本.

ruby multithreading elixir

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

如何对 mix.exs 中定义的别名进行描述?

当我在mix.exsand run 中定义别名时mix help,它只会将其描述显示为“在 mix.exs 中定义的别名”。

假设,例如,我有这个mix.exs

  defp aliases do
    [
      play: "run --no-halt"
    ]
  end
Run Code Online (Sandbox Code Playgroud)

然后,该mix help命令显示如下任务列表:

...
mix local.rebar       # Installs Rebar locally
mix new               # Creates a new Elixir project
mix play              # Alias defined in mix.exs
mix profile.cprof     # Profiles the given file or expression with cprof
mix profile.eprof     # Profiles the given file or expression with eprof
...
Run Code Online (Sandbox Code Playgroud)

如何描述play任务?

elixir-mix elixir

2
推荐指数
1
解决办法
119
查看次数