小编Bro*_*tse的帖子

Angular Dependency Injection - @Injectable()在测试中失败,而@Inject()工作

一般问题

我刚刚开始将带有角度5的webpacker添加到现有的rails应用程序中.一切都很好,除了测试DI的奇怪问题.

看来我的Angular组件在使用浏览器创建时才起作用,但在使用Jasmine/Karma进行测试时,Dependency Injector无法识别注入令牌.使用伪代码:

@Component({...})
export class SomeComponent {
  constructor(private service: SomeService) {}
}
Run Code Online (Sandbox Code Playgroud)

以上工作在浏览器中,但正在Error: Can't resolve all parameters for SomeComponent: (?).测试中.到目前为止,我注意到它适用于所有@Injectable(),但是一旦我用显式的@Inject替换每个注入:

@Component({...})
export class SomeComponent {
  constructor(@Inject(SomeService) private service: SomeService) {}
}
Run Code Online (Sandbox Code Playgroud)

一切正常(但显然是非常麻烦).有什么明显可能导致这种情况吗?

实际代码

我有一个非常简单的服务与HttpClient一起运行:

import { Injectable } from "@angular/core";
import { HttpClient } from "@angular/common/http";

import 'rxjs/add/operator/map'

@Injectable()
export class GeneralStatsService {
  constructor(
    private http : HttpClient
  ) {}

  getMinDate() {
    return this.http.get("/api/v1/general_stats/min_date")
      .map(r => new Date(r))
  }
}
Run Code Online (Sandbox Code Playgroud)

当我导航到使用所述服务的组件时,它按预期工作.但是,在使用Jasmine进行测试时,它不起作用:

import { TestBed } from …
Run Code Online (Sandbox Code Playgroud)

dependency-injection ruby-on-rails typescript webpacker angular

14
推荐指数
1
解决办法
1179
查看次数

Rails 3.2.13 vs Rails 4.0.1 - 改变了吗?方法改变了?

我最近注意到,changed?ActiveRecord对象上的方法在Rails 3.2.13和Rails 4.0.1之间发生了变化.问题是连接到数据库中的整数字段的字段.假设我有模型Modelnumber整数字段:

# Rails 3.2.13

m = Model.last
m.number                #=> 5
m.number = '5hello'
m.number                #=> 5
m.number_changed?       #=> true
m.changed?              #=> true
m.changes               #=> {:number => [5,5]}

# Rails 4.0.1

m = Model.last
m.number                #=> 5
m.number = '5hello'
m.number                #=> 5
m.number_changed?       #=> false
m.changed?              #=> false
m.changes               #=> {}
Run Code Online (Sandbox Code Playgroud)

这会导致表单验证时出现一些非常烦人的问题 - 如果用户试图将整数值更改为无效字符(但类型转换将导致与初始值相同的值),rails将不会调用save方法,也不会调用验证(包括numericality: { only_integer: true })将运行.

我设法通过覆盖number_changed?方法来解决这个问题super || number.to_s != number_before_type_cast,但这非常难看.

问题是:为什么这会改变?这是一个错误还是故意改变?如何在不覆盖整数列的所有元方法的情况下修复它?

ruby ruby-on-rails ruby-on-rails-3 ruby-on-rails-4

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

Java中Ruby Harash的等价物

我真的在Ruby中使用以下类型的代码:

my_hash = {}

my_hash['test'] = 1
Run Code Online (Sandbox Code Playgroud)

Java中的对应数据结构是什么?

ruby java hash

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

rails中的相关关联

舞台:

假设我的模型定义如下:

class Client < AR:Base
  has_one :driver_profile, class_name: 'Driver'
  has_many :races
end

class Driver
  # attribute :dob

  belongs_to :client
  has_and_belongs_to_many :teams
end

class Race
  # attribute :date

  belongs_to :client
  has_and_belongs_to_many :drivers
end
Run Code Online (Sandbox Code Playgroud)

这背后的逻辑是:在页面上注册的每个客户端都能够注册多个不同的比赛,每个团队可以拥有多个驱动程序.然而,每个客户也是一个驱动程序,默认情况下,它将被分配给他的每个团队.为了达到这个目的,我已经覆盖了Team drivers阅读器(我正在使用andandgem):

def drivers
  association = super
  driver_profile = client.andand.driver_profile
  if !driver_profile || driver_profile.new_record? || association.include? driver_profile 
    association << client.driver_profile
  end
  association
end
Run Code Online (Sandbox Code Playgroud)

这很好用,但是并不像我希望的那样漂亮(每当我调用这个方法时它会进行额外的db调用).

问题

我有一个非常庞大的多步形式适用于所有型号.在前两个步骤中,用户可以编辑他的个人信息(在客户端模型上),他的driver_profile和他的初始比赛.在后面的步骤中,他可以为他的比赛添加任意数量的驾驶员,但是驾驶员的出生日期需要根据比赛日期进行验证(必须至少为21).

问题是,此验证不属于驱动程序模型,因为驱动程序可能对一个种族有效,并且对第二次竞赛无效.因此,这是一个种族问题,而不是一个驱动因素.我写了这样的验证(在Race模型上):

validate :drivers_at_least_21

def drivers_at_least_21
  error = false
  drivers.each do |driver|
    if driver.age_at(start) < 21
      driver.errors.add(:dob, :too_young)
      error …
Run Code Online (Sandbox Code Playgroud)

ruby database-design ruby-on-rails

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

iOS上的KeyDown事件,2和@之间没有区别

我有一个我想要的输入(除了其他格式化的东西)只允许数字.这对keyDown事件很容易:

field.keydown(function(e) {
  if (e.shiftKey) return false;
  var key = e.which;
  var is_numeric = ((key <= 57 && key >= 48) || (key <= 105 && key >= 96));
  // ...
  if (is_numeric && ..) {
    format_field();
    return true;
  }
  return false;
}
Run Code Online (Sandbox Code Playgroud)

这工作很漂亮,但是我有iOS的严重的问题,因为有具有相同的键码对符号,数字(例如@2既有代码50,或者1!都是49),并且在余下的标志无差异以及(shiftKey,altKey,"ctrlKey`对于两个事件造成的).我已经测试了这些事件:http://api.jquery.com/keydown/(参见页面底部的演示),我没有注意到这些对的keyDown事件之间有任何区别.

绝对没有办法告诉我哪个键被按下了或者我错过了什么?

javascript jquery ios

5
推荐指数
0
解决办法
1474
查看次数

使用 upsert 时未定义方法“keys”

我想使用 upsert_all 方法在简单查询中从集合中插入(和更新)记录,例如:

books = [] 

10.times do |i|
  books << Book.new(name: "book #{i}")
end

Book.upsert_all(books)
Run Code Online (Sandbox Code Playgroud)

但是,我收到以下错误:

.../activemodel-6.1.4.1/lib/active_model/attribute_methods.rb:469:in `method_missing': undefined method `keys' for #<Book id: nil, name: "book 0"> (NoMethodError)
Run Code Online (Sandbox Code Playgroud)

我正在寻找的是能够插入所有或 upsert_all 任意集合作为一本书,例如,如果您能帮助我,我将不胜感激

ruby activerecord rubygems ruby-on-rails

3
推荐指数
1
解决办法
1980
查看次数

在bash中执行带有空格的参数的命令

使用bash执行某些命令时遇到问题.假设我有一个简单的bash脚本:

#!/bin/bash
cmd="sh -c \"ls\""
$cmd
Run Code Online (Sandbox Code Playgroud)

这很好用.但是,如果我更改命令的参数以包含空格:

#!/bin/bash
cmd="sh -c \"ls -a\""
$cmd
Run Code Online (Sandbox Code Playgroud)

然后它抛出-a": 1: -a": Syntax error: Unterminated quoted string错误.似乎bash正确地注意到开放引用,但它停止在第一个空间寻找结束引用.如果我改变$cmdecho $cmd它返回sh -c "ls -a"预期.如果我在终端中执行此命令一切正常,但$(./mysh.sh)失败并出现相同的错误.

我曾尝试用\(或双重逃避)引用来逃避空间\\\"(愚蠢的想法,但值得一试).谁能解释一下这里发生了什么?

bash

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

Rails 控制台不工作。出现此错误

Traceback (most recent call last):
16: from /home/hman01/.rvm/rubies/ruby-2.5.0/bin/irb:11:in `<main>'
15: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb.rb:381:in `start'
14: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb.rb:381:in `new'
13: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb.rb:410:in `initialize'
12: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb.rb:410:in `new'
11: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/context.rb:91:in `initialize'
10: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/extend-command.rb:242:in `save_history='
 9: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:45:in `save_history='
 8: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:21:in `init_save_history'
 7: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:21:in `extend'
 6: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:65:in `extended'
 5: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:75:in `load_history'
 4: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:75:in `open'
 3: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:76:in `block in load_history'
 2: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:76:in `each'
 1: from /home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:76:in `block (2 levels) in load_history'
/home/hman01/.rvm/rubies/ruby-2.5.0/lib/ruby/2.5.0/irb/ext/save-history.rb:76:in `<<': string contains null …
Run Code Online (Sandbox Code Playgroud)

ruby ruby-on-rails

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