Mar*_*kus 36 mount ruby-on-rails named-routing rails-engines ruby-on-rails-3
我正在制作一个小型轨道引擎,我这样安装:
mount BasicApp::Engine => "/app"
Run Code Online (Sandbox Code Playgroud)
使用这个答案,我已经验证了引擎中的所有路由都应该是:
但是 - 当我(在引擎内)链接到命名路由(在引擎内定义)时,我收到此错误
undefined local variable or method `new_post_path' for #<#<Class:0x000000065e0c08>:0x000000065d71d0>
Run Code Online (Sandbox Code Playgroud)
运行"rake route"清楚地验证"new_post"应该是一个命名路径,所以我不知道为什么Rails(3.1.0)无法解决它.欢迎任何帮助
我的config/route.rb(对于引擎)看起来像这样
BasicApp::Engine.routes.draw do
resources :posts, :path => '' do
resources :post_comments
resources :post_images
end
end
Run Code Online (Sandbox Code Playgroud)
我应该补充说它是和孤立的引擎.但是,像main_app.root_path这样的路径工作正常 - 而root_path却没有
Jam*_*sen 56
我相信最好的解决方案是调用new_post_path引擎的路由代理,它可以作为辅助方法使用.在您的情况下,辅助方法将默认为basic_app_engine,因此您可以调用basic_app_engine.new_post_path视图或帮助程序.
如果需要,可以使用以下两种方式之一设置名称.
# in engine/lib/basic_app/engine.rb:
module BasicApp
class Engine < ::Rails::Engine
engine_name 'basic'
end
end
Run Code Online (Sandbox Code Playgroud)
要么
# in app/config/routes.rb:
mount BasicApp::Engine => '/app', :as => 'basic'
Run Code Online (Sandbox Code Playgroud)
在任何一种情况下,您都可以调用basic.new_posts_path您的观点或帮助者.
另一个选择是不使用已安装的引擎,而是让引擎将路由直接添加到应用程序.Thoughtbot的HighVoltage就是这么做的.我不喜欢这个解决方案,因为它可能会在您添加许多引擎时导致名称空间冲突,但它确实有效.
# in engine/config/routes.rb
Rails.application.routes.draw do
resources :posts, :path => '' do
resources :post_comments
resources :post_images
end
end
# in app/config/routes.rb:
# (no mention of the engine)
Run Code Online (Sandbox Code Playgroud)
在Rails 4上,该engine_name指令对我不起作用.
要从引擎自己的视图或控制器访问引擎路由中定义的命名路由,我最终使用了详细信息
BasicApp::Engine.routes.url_helpers.new_post_path
Run Code Online (Sandbox Code Playgroud)
我建议定义一个简单的帮助方法,使其更有用
# in /helpers/basic_app/application_helper.rb
module BasicApp::ApplicationHelper
def basic_app_engine
@@basic_app_engine_url_helpers ||= BasicApp::Engine.routes.url_helpers
end
end
Run Code Online (Sandbox Code Playgroud)
有了这个,你现在可以使用
basic_app_engine.new_post_path
Run Code Online (Sandbox Code Playgroud)
如果您需要从引擎访问主应用程序助手,您可以使用main_app:
main_app.root_path
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
19237 次 |
| 最近记录: |