我阅读了Steve Freeman和Nat Pryce 的测试指导下的面向对象的软件,并给我留下了深刻的印象.我想在使用RSpec的Rails项目中采用本书的思想,尽管它的例子是用Java编写的.
本书的基本原则是我们应该模拟接口而不是具体的类.他们说我们可以通过提取接口并命名它们来改进应用程序设计.
但是,Ruby没有任何与Java相同的语法interface
.我如何利用他们的技术进行Rails项目?
UPDATE
例如,在页面126中,作者引入了Auction
接口以实现该bid
方法.首先,他们嘲笑Auction.class
让测试通过,然后他们在Auction
类中实现了一个类作为匿名内部Main
类.最后,他们XMPPAuction
从Main
(第131-132页)中提取了一个新的具体类.
在我看来,这种增量方法是本书的关键.
如何在Ruby开发中采用或模仿这样一系列代码转换?
有时我会运行一个命令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
.我该怎样预防呢?
我正在开发一个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.
我已经定义了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 脚本时,它会打印出{"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"}
?这种行为背后的机制是什么?
为了使用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。
Rails API 文档说明了以下关于has_many_attached
和has_one_attched
方法的内容:
如果 :dependent 选项未设置,则每当记录被销毁时,所有附件都将被清除(即销毁)。
具体来说,我应该为这个选项指定什么值?
Erlang官方用户指南(http://erlang.org/doc/reference_manual/data_types.html#id67942)说:
如果原子不是以小写字母开头,或者如果它包含除字母数字字符,下划线(_)或@之外的其他字符,则用单引号(')括起来.
为什么Erlang允许原子包含裸@符号?它是否具有实际用途或任何历史意义?
我编写了以下 mix.ex 以将我的 Phoenix 应用程序作为 tar 球发布,请参阅 Mix.Tasks.Release 文档的 \xe2\x80\x9cSteps\xe2\x80\x9d部分。
\ndefmodule 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, ©_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
,它 …
为了创建 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) 我有以下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版本.
当我在mix.exs
and 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
任务?