Ruby on Rails 3 - 如何提交在主应用程序中呈现的 Rails3.1 引擎表单以提交给引擎的控制器?



我正在为可注释功能构建一个新的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

相关内容

  • 没有找到相关文章

最新更新