我有一个标准的has_many关系(预订有很多订单),验证如果没有至少一个订单,预订不会得到保存.我正试图用FactoryGirl工厂复制这个,但验证阻止我这样做.
class Booking < ActiveRecord::Base
has_many :orders
validates :orders, presence: true
end
class Order < ActiveRecord::Base
belongs_to :booking
end
Run Code Online (Sandbox Code Playgroud)
以下是FactoryGirl的GitHub维基页面中每个型号的FactoyGirl工厂规格.
FactoryGirl.define do
factory :booking do
factory :booking_with_orders do
ignore do
orders_count 1
end
before(:create) do |booking, evaluator|
FactoryGirl.create_list(:order, evaluator.orders_count, booking: booking)
end
end
end
factory :order do
booking
end
end
Run Code Online (Sandbox Code Playgroud)
当我尝试FactoryGirl.create(:booking_with_orders)从我的规范运行时,我得到:
Failure/Error: @booking = FactoryGirl.create(:booking_with_orders)
ActiveRecord::RecordInvalid:
Validation failed: Orders can't be blank
Run Code Online (Sandbox Code Playgroud)
似乎验证的检查正在运行,甚至在before(:create) [...]此之前理论上会创建预订的订单.
这篇文章建议不要has_many为你的工厂添加关系,但如果有一个很好的方法,我想解决这个问题.
提前致谢.
我如何从log/development.log中静音/忽略这些延迟作业查询日志?
Delayed::Backend::ActiveRecord::Job Load (1.0ms) UPDATE "delayed_jobs" SET locked_at = '2013-11-19 19:55:45.053991', locked_by = 'host:desktop-virtual pid:22277' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at <= '2013-11-19 19:55:45.053435' AND (locked_at IS NULL OR locked_at < '2013-11-19 15:55:45.053519') OR locked_by = 'host:desktop-virtual pid:22277') AND failed_at IS NULL) ORDER BY priority ASC, run_at ASC LIMIT 1 FOR UPDATE) RETURNING *
Delayed::Backend::ActiveRecord::Job Load (1.4ms) UPDATE "delayed_jobs" SET locked_at = '2013-11-19 19:55:50.056977', locked_by = 'host:desktop-virtual pid:22277' WHERE id IN (SELECT id FROM "delayed_jobs" WHERE ((run_at …Run Code Online (Sandbox Code Playgroud) 我有一个奇怪的用例,我需要在没有Gemfile.lock的另一个新制作的Rails应用程序上从Rails应用程序发出"bundle install"(作为system()命令).
我知道这通常是从命令行完成的,但我需要在Rails中完成.
作为参考,irb可以轻松实现这一点.它按预期基于Gemfile获取gem并生成Gemfile.lock.
出于某种原因,当我在Rails控制台(来自另一个应用程序)并发出相同系列的命令时,bundle命令实际上不会获取或更新gem,也不会生成Gemfile.lock.
正如塔德曼指出的那样,我认为这是由于环境在irb和之间的变化rails console.bundle install从system()执行时,该命令作用于启动Rails控制台而不是目标应用程序的Rails应用程序.
即使尝试ENV将Rails控制台中的变量与我中的变量匹配irb仍然无法弄清楚(参见下面的尝试).
测试这个的步骤:
cd && rails new myapp --skip-bundlerails consoleDir.chdir("/home/user/myapp")system("bundle install")用irb(成功):
1.9.3p429 :002 > Dir.chdir("/home/user/myapp")
=> 0
1.9.3p429 :003 > system("bundle install")
Updating git://github.com/plataformatec/devise.git
Fetching gem metadata from https://rubygems.org/..........
Fetching gem metadata from https://rubygems.org/..
Resolving dependencies...
Using rake (10.1.0)
Using i18n (0.6.4)
Using minitest (4.7.5)
Using multi_json (1.7.7)
Using atomic (1.1.10)
Using thread_safe …Run Code Online (Sandbox Code Playgroud) Thor :: Actions(http://textmate.rubyforge.org/thor/Thor/Actions.html)有一些很棒的帮助方法我想访问但是如果不使用Thor CLI应用程序我似乎无法使用它们.
我试过简单地说:
require "rubygems"
require "thor"
Thor::Actions.create_file "foo.txt", "contents"
Run Code Online (Sandbox Code Playgroud)
哪个投掷:
run.rb:4:in '<main>': undefined method 'create_file' for Thor::Actions:Module (NoMethodError)
我意识到我可能会遗漏一些非常简单的东西.谢谢.
根据我正在处理的内容,我通常f = Foo.last在打开rails console.
有什么方法可以在我的开发环境中自动执行此操作吗?
就其价值而言,我正在使用 pry。
我可以这样做,但会话将退出:
$ rails c <<EOF
heredoc> f = Foo.last
heredoc> EOF
Run Code Online (Sandbox Code Playgroud) 我想是能包住SASS的@include一个缩写,如@i为了方便.
这可能吗?这样做的最佳方法是什么?
#foo {
@include rounded(3px);
}
Run Code Online (Sandbox Code Playgroud)
变为:
#foo {
@i rounded(3px);
}
Run Code Online (Sandbox Code Playgroud)
提前致谢.
ruby ×2
bundler ×1
css ×1
delayed-job ×1
factory-bot ×1
irb ×1
logging ×1
pry ×1
sass ×1
thor ×1