小编Har*_*Wit的帖子

如何在RSpec中说"any_instance""should_receive"任意次

我在rails中有一个导入控制器,它将多个带有多条记录的csv文件导入到我的数据库中.我想在RSpec中测试是否使用RSpec实际保存了记录:

<Model>.any_instance.should_receive(:save).at_least(:once)
Run Code Online (Sandbox Code Playgroud)

但是我得到错误说:

The message 'save' was received by <model instance> but has already been received by <another model instance>
Run Code Online (Sandbox Code Playgroud)

一个人为的控制器示例:

rows = CSV.parse(uploaded_file.tempfile, col_sep: "|")

  ActiveRecord::Base.transaction do
    rows.each do |row| 
    mutation = Mutation.new
    row.each_with_index do |value, index| 
      Mutation.send("#{attribute_order[index]}=", value)
    end
  mutation.save          
end
Run Code Online (Sandbox Code Playgroud)

是否可以使用RSpec进行测试或是否有解决方法?

testing rspec ruby-on-rails mocking mocha.js

68
推荐指数
6
解决办法
3万
查看次数

在命名空间内设计

我正在尝试将我的rails项目拆分为普通用户的前端和管理员的后端.因此,我创建了一个名称空间"admin",以便我可以在地图管理员中轻松控制管理员特定的控制器方法/布局/身份验证.

我正在使用Devise来注册/验证我的管理员.因为它仅用于管理员,所以我试图将Devise移动到管理员命名空间.

我无法在Devise 的文档中找到我正在寻找的内容,但我在routes.rb中尝试过类似的内容:

namespace 'admin'do 
  devise_for :admins
end
Run Code Online (Sandbox Code Playgroud)

我也尝试制作一个自定义的Devise :: Sessions控制器,但这似乎也没有成功.

有谁知道如何做到这一点?我应该使用自定义(管理员)布局的常规路线设计吗?

namespaces ruby-on-rails ruby-on-rails-plugins devise

37
推荐指数
4
解决办法
2万
查看次数

同时使用2个版本的gem

我可以在一个应用程序中使用两个版本的gem吗?我正在尝试使用两个rails插件一起工作:

  1. Pengwynn的LinkedIn https://github.com/pengwynn/linkedin用于LinkedIn API调用,依赖于oauth(〜> 0.3.5)
  2. 用户通过多个知名网站登录的OmniAuth依赖于oauth 0.4.0

当我尝试在rails中的东西时,我收到此错误消息:

$ rails server
c:/Ruby187/lib/ruby/gems/1.8/gems/bundler-1.0.7/lib/bundler/resolver.rb:129:in `resolve': Bundler could not find compatible versions for gem "oauth": (Bundler::VersionConflict)
  In snapshot (Gemfile.lock):
    oauth (0.4.4)

  In Gemfile:
    linkedin depends on
      oauth (~> 0.3.5)

Running `bundle update` will rebuild your snapshot from scratch, using only
the gems in your Gemfile, which may resolve the conflict.
Run Code Online (Sandbox Code Playgroud)

尝试捆绑更新只会冻结我的终端

是否可以同时使用这两个插件?

rubygems ruby-on-rails

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

CSS动态宽度大于100%

我有一个父容器,它包含一个浮动项目列表.添加新的浮动项目时,父容器可以很好地向右扩展.

但是当我添加更多项目并且项目靠近窗口右侧时,新项目才会跳转到新行.相反,我希望它继续向右扩展,使我的父容器大于100%.

是否可以将容器宽度定义为max-width:infinite;?

要回答我自己的问题,我知道我可以制作最大宽度为5000%的东西,但我只是想知道是否有更好的解决方案.我认为页面的高度是最大宽度有点奇怪:无限; 并且页面的宽度不能具有相同的行为.

也许这只是一个愚蠢的问题,但无论如何我都会问:P.

css width

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

Rails可安装发动机并覆盖另一个发动机

我正处于将标准Rails应用程序转换为可安装引擎的过程中.该应用程序可与标准博客应用程序相媲美,我希望每个模型,控制器和视图都可以扩展,因此我选择了可​​安装的引擎.

我使用的宝石之一是Devise,据我所知,这是一种可安装的引擎本身.它可以在这里所述的可安装发动机内使用.

我可以在我的引擎中部分使用它.一切都很好,包括一些Devise控制器我覆盖像这样:

# config/routes.rb

Bbronline::Engine.routes.draw do
  devise_for :users, class_name: "Bbronline::User", module: :devise,
    controllers: { registrations: "bbronline/devise_overrides/registrations"}
    ...

# controllers/bbronline/devise_overrides/registrations_controller.rb
require_dependency "bbronline/application_controller"

module Bbronline

class DeviseOverrides::RegistrationsController < Devise::RegistrationsController

  def new_intermediair
    @user = User.new
  end
  ...
Run Code Online (Sandbox Code Playgroud)

正确的视图'views/bbronline/devise_overrides/registrations/new_intermediair.html.haml'也按预期正确加载.

但是我的问题是我没有自定义控制器覆盖的视图没有正确加载.例如,登录视图所在的视图views/bbronline/devise/sessions/new.html.haml和未加载的视图.相反,标准的Devise登录视图会被加载,即devise-2.1.0/app/views/devise/sessions/new.html.erb

当然我可以通过用我自己的控制器覆盖每个控制器来解决这个问题,就像我上面的registrations_controller一样,但这看起来非常难看.是否覆盖每个控制器的方式?是否有更方便的方法从另一个可安装引擎中覆盖可安装引擎的视图?

overriding ruby-on-rails actionview rails-engines devise

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

测试一个lambda

我正在创建一个导入功能,可将CSV文件导入到多个表中.我创建了一个模块CsvParser,用于解析CSV文件并创建记录.我接收创建动作的模型扩展了CsvParser.他们调用CsvParser.create并传递正确的属性顺序和一个可选的lambda value_parser.此lambda将散列中的值转换为优先格式.

class Mutation < ActiveRecord::Base
  extend CsvParser

  def self.import_csv(csv_file)
    attribute_order = %w[reg_nr receipt_date reference_number book_date is_credit sum balance description]

    value_parser = lambda do |h|
      h["is_credit"] = ((h["is_credit"] == 'B') if h["is_credit"].present?)
      h["sum"] = -1 * h["sum"].to_f unless h["is_credit"]
      return [h]
    end

    CsvParser.create(csv_file, self, attribute_order, value_parser)    
  end
end
Run Code Online (Sandbox Code Playgroud)

我在方法中使用lambda而不是检查的CsvParser.create原因是因为lambda就像属于这个模型的业务规则.

我的问题是我应该如何测试这个lambda.我应该在模型或CsvParser中测试吗?我应该测试lambda本身还是self.import方法数组的结果?也许我应该制作另一个代码结构?

我的CsvParser看起来如下:

require "csv"

module CsvParser

  def self.create(csv_file, klass, attribute_order, value_parser = nil)
    parsed_csv = CSV.parse(csv_file, col_sep: "|")

    records = …
Run Code Online (Sandbox Code Playgroud)

ruby testing lambda unit-testing rspec

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