我正在为可注释功能构建一个新的rails3.1引擎。
我创建了引擎,生成了名为Comment
的资源。
发动机的config/routes.rb
具有:
Kurakani::Engine.routes.draw do
resources :comments
end
spec/dummy
rails应用程序有一个名为Post
的资源,其路由有:
Rails.application.routes.draw do
resources :posts do
resources :comments
end
mount Kurakani::Engine => "/kurakani"
end
我已经设置了引擎的Comment模型和dummy-rails应用程序的Post模型之间的关联。
然后在spec/dummy
rails应用程序中,我在Post的show
模板中呈现了评论表单。生成的表单还带有指向post/1/comments
的操作路径。
当我运行规范时,我认为它试图在spec/dummy
应用程序本身中搜索控制器,而不是提交给引擎的app/controllers/kurakani/comments_controller.rb
,所以我在运行规范时收到以下错误。
$ bundle exec rspec spec/integration/comments_spec.rb ruby-1.9.2-p180
No examples matched {:focus=>true}. Running all.
Run filtered excluding {:exclude=>true}
/Users/millisami/gitcodes/kurakani/app/views/kurakani/comments/_form.html.erb:3:in `___sers_millisami_gitcodes_kurakani_app_views_kurakani_comments__form_html_erb___1787449207373257052_2189921740'
F
Failures:
1) Kuraki::Comment authenticated user creating a new comment
Failure/Error: click_button "Create"
ActionController::RoutingError:
uninitialized constant CommentsController
# ./spec/integration/comments_spec.rb:29:in `block (3 levels) in <top (required)>'
如何指定要提交到引擎的comments_controller.rb
而不是spec/dummy
应用程序的注释??
如果我不能把问题弄清楚,我已经把回购推到了https://github.com/millisami/kurakani
问题是,生成的表单的路由转到/posts/:post_id/comments
,这是在应用程序中定义的路由,但不是引擎。你的引擎只定义了这个路线:
resources :comments
这(几乎)是有效的,因为引擎看到应用程序具有与CommentsController
匹配的路由,只是没有CommentsController
可供其使用。
我从GitHub下载了该应用程序,并进行了一次尝试,将app/views/kurakani/comments/_form.html.erb
中的form_for
更改为:
form_for(Kurakani::Comment.new, :url => kurakani.comments_path)
这使测试通过,但我不确定它是否真的能满足你的需求。你可能会想自己玩URL的部分。
这里发生的情况是,这个视图是由主应用程序使用spec/dummy/app/posts/show.html.erb
中的kurakani_list
帮助程序呈现的,这意味着您引用的任何URL帮助程序(直接或间接)都将指向应用程序,而不是引擎,就像我认为您希望的那样。
因此,为了告诉Rails我们希望表单转到的真正路由是什么,必须指定:url
选项,并告诉它我们要转到kurakani.comments_path
,而不是应用程序定义的comments_path
。
如果我们想做相反的操作(从引擎中引用应用程序路由),我们将使用main_app
而不是kurakani
。