每当我遇到正在使用的Rails版本4和Rails版本5之间的版本(主要是语法)问题时,我都遵循restaurantly Rails教程。
完成本教程this页上的步骤后,我认为在测试销毁功能失败后,这是另一个语法差异。
rspec spec/features/restaurants_spec.rb
Capybara starting Puma...
* Version 3.12.0 , codename: Llamas in Pajamas
* Min threads: 0, max threads: 4
* Listening on tcp://127.0.0.1:41471
.F
Failures:
1) destroy links work displays Restaurantly Spots!
Failure/Error: expect(page).to have_no_content 'mc ruby'
expected not to find text "mc ruby" in "mc ruby"
# ./spec/features/restaurants_spec.rb:27:in `block (3 levels) in <top (required)>'
Finished in 7.25 seconds (files took 2.24 seconds to load)
2 examples, 1 failure
Failed examples:
rspec ./spec/features/restaurants_spec.rb:20 # destroy links work displays Restaurantly Spots!
我运行了puma -e 'test'
以在“测试”环境和浏览器中手动运行该应用程序,以亲自执行控制器操作。我发现我也有同样的失败行为。我所有定义的动作,包括create
,edit
,update
和show
都按预期工作。但是destroy
的行为类似于show
,只是显示了该商品的显示页面,或者重定向到根目录并删除了该商品。
如果我在包括rails server
函数在内的“开发”环境中运行destroy
,所有这些工作将按预期进行。
这里有一些应用程序的不同部分,以防万一:
app/controllers/restaurants_controller.rb:
def destroy
@restaurant = Restaurant.find_by_id params[:id]
@restaurant.destroy
redirect_to root_path
end
app/views/restaurants/index.html.haml
.row
.large-8.columns.large-centered
%h3.subheader.center
Restaurantly Spots!
.row
.large-8-columns.large-centered
- @restaurants.each do |restaurant|
%h5.subheader
= restaurant.name
= link_to "edit", edit_restaurant_path(restaurant)
= link_to "destroy", restaurant_path(restaurant), method: :destroy
我的Gemfile的一部分,其中包括开发,测试gem:
group :test, :development do
gem 'rspec-rails'
gem 'factory_bot_rails'
gem 'capybara'
gem 'pry'
gem 'pry-byebug'
end
我一次将测试数据库删除,然后再次创建它。我用与创建原始数据库和开发数据库相同的方法来执行此操作,方法是先运行bundle exec rake db:create
,然后运行bundle exec rake db:migrate
,最后运行bundle exec rake db:test:prepare
。
config/database.yml
development:
adapter: postgresql
encoding: unicode
database: restaurantly_dev
pool: 5
host: ""
timeout: 5432
test:
adapter: postgresql
encoding: unicode
database: restaurantly_test
pool: 5
host: ""
timeout: 5432
有什么想法为什么它在开发和测试环境之间的破坏功能表现得不同?
答案 0 :(得分:0)
感谢@arieljuod指出,当方法应该为common_names <- Reduce(intersect, list(names(vec1), names(vec2), names(vec3)))
vec1[common_names] + vec2[common_names] + vec3[common_names]
# X25 X58 X79 X212 X311 X422 X536 X899 X1080 X1322 X1516 X1705 X1890
# 66 69 72 81 84 87 90 93 99 105 108 111 114
时,我将方法设为:destroy
。我可能是在故障排除过程中偶然添加的,所以我不能一直说这是问题所在。尤其是因为删除功能在开发环境而不是测试环境中起作用。但是,在进行了之前从未见过的更改之后,我遇到了路由错误,并且仍在尝试:delete
而不是POST
。
我读了这个answer,发现删除// = require jquery2 DELETE
// = require jquery_ujs
and
application.css`文件后,两者似乎都可以正常工作生产和测试。我不知道为什么在那里,或者为什么它可以解决问题。我的功能测试现在也通过了。