我在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进行测试或是否有解决方法?
我正在尝试将我的rails项目拆分为普通用户的前端和管理员的后端.因此,我创建了一个名称空间"admin",以便我可以在地图管理员中轻松控制管理员特定的控制器方法/布局/身份验证.
我正在使用Devise来注册/验证我的管理员.因为它仅用于管理员,所以我试图将Devise移动到管理员命名空间.
我无法在Devise 的文档中找到我正在寻找的内容,但我在routes.rb中尝试过类似的内容:
namespace 'admin'do
devise_for :admins
end
Run Code Online (Sandbox Code Playgroud)
我也尝试制作一个自定义的Devise :: Sessions控制器,但这似乎也没有成功.
有谁知道如何做到这一点?我应该使用自定义(管理员)布局的常规路线设计吗?
我可以在一个应用程序中使用两个版本的gem吗?我正在尝试使用两个rails插件一起工作:
当我尝试在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)
尝试捆绑更新只会冻结我的终端
是否可以同时使用这两个插件?
我有一个父容器,它包含一个浮动项目列表.添加新的浮动项目时,父容器可以很好地向右扩展.
但是当我添加更多项目并且项目靠近窗口右侧时,新项目才会跳转到新行.相反,我希望它继续向右扩展,使我的父容器大于100%.
是否可以将容器宽度定义为max-width:infinite;?
要回答我自己的问题,我知道我可以制作最大宽度为5000%的东西,但我只是想知道是否有更好的解决方案.我认为页面的高度是最大宽度有点奇怪:无限; 并且页面的宽度不能具有相同的行为.
也许这只是一个愚蠢的问题,但无论如何我都会问:P.
我正处于将标准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一样,但这看起来非常难看.是否覆盖每个控制器的方式?是否有更方便的方法从另一个可安装引擎中覆盖可安装引擎的视图?
我正在创建一个导入功能,可将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) devise ×2
rspec ×2
testing ×2
actionview ×1
css ×1
lambda ×1
mocha.js ×1
mocking ×1
namespaces ×1
overriding ×1
ruby ×1
rubygems ×1
unit-testing ×1
width ×1