我使用
在我的应用中安装了RailsAdmin引擎(根据维基的说明)mount RailsAdmin :: Engine => '/ backend',:as => 'rails_admin'
我不得不从引擎扩展一个控制器来添加一个before_filter。 在开发中运行我的应用程序时,我的扩展程序和其他引擎功能正常运行。
但是我在使用Test :: Unit 为我的before_filter编写功能测试时遇到了问题。 过滤器在正确的时刻启动并按预期工作,但是一旦前面的过滤器“调整”的操作重定向到索引(这是预期的结果),我得到以下路由错误:
ActionController :: RoutingError:没有路由匹配{:controller =>“rails_admin / main”}
导致异常的代码在于引擎的方法重定向到索引或上一页(引用的种类);这是方法的代码
def back_or_index
如果params [:return_to] .presence
PARAMS [:的return_to]
否则
index_path
结束
我发现在开发中运行应用程序时,index_path触发的url_for调用提供了正确的 path_segments(即:: model_name =>'user'),以便下面的路由是匹配
index GET|POST /:model_name(.:format) rails_admin/main#index
另一方面,在运行测试时,不提供path_segments,因此在查找匹配路径时不满足:model_name 约束。
由于我是引擎新手,有人可以告诉我我缺少什么吗?
对我而言,看起来引擎应该考虑生成index_path的事实,但正如我所说的那样,我不是这方面的专家......
答案 0 :(得分:2)
use_route 还不够:无论如何,对 index_path 的调用都失败了。
经过大量调试后,我还不完全确定为什么相同的代码在 test 和 development 中都不起作用的根本原因。
我观察到开发中的 index_path 能够从请求的网址推断出 model_name ,而在中测试不是。
虽然很难看,但我的解决办法是在app / controllers / rails_admin / main_controller.rb中覆盖以下方法
module RailsAdmin
class MainController
# Override to fix a routing error when running tests
def back_or_index
if params[:return_to].presence && params[:return_to].include?(request.host) && (params[:return_to] != request.fullpath)
params[:return_to]
else
# forward :model_name as default_url_options is not aware of it in tests
index_path( :model_name => params[:model_name] )
end
end
end
end
在我的MainController控制器规范中,我执行以下操作
put :edit, { :model_name => 'user', :id => root.id, :user => { :role => :root }, :use_route => :rails_admin }
这就是我的路线
devise_for :users
mount RailsAdmin::Engine => '/backend', :as => 'rails_admin'
mount Rich::Engine => '/rich', :as => 'rich'
如果有人有更好的解决方案,分享会非常感激!