【问题标题】:How do I use current_page? to reference a mounted engine path?如何使用 current_page?参考安装的发动机路径?
【发布时间】:2013-09-24 17:53:07
【问题描述】:

如果我们正在查看当前页面,我使用 :class=>('active' if current_page?desired_pa​​th) 将选定的标签添加到导航链接:

<%= link_to "Portfolio", portfolio_path, :class =>('active' if current_page?portfolio_path) %>

我希望此功能适用于指向已安装引擎的页面。来自我的 routes.rb:

mount Blogit::Engine => "/blog"

我想做这样的事情:

<%= link_to "Blog", blogit_path, :class =>('active' if current_page?blogit_path) %>

。 . .但显然 blogit_path 不是合适的路径,因为我的班级从未设置为活动状态。我也试过current_page?('/blog'),因为我在网址http://myapp.com/blog - 但即使这样也行不通。

请注意,只要我在博客引擎的路径中,current_page?blog_root_path 就可以工作。如果我在引擎之外,我会得到错误。

如何使用 current_page 引用已安装的引擎路径?

以下是相关的rake routes 结果:

. . .
blogit        /blog                          Blogit::Engine
                    root GET    /                              home#index
         portfolio_index GET    /portfolio(.:format)           portfolio#index
               portfolio GET    /portfolio(.:format)           portfolio#index

Routes for Blogit::Engine:
              GET    /posts/page/:page(.:format)            blogit/posts#index
post_comments POST   /posts/:post_id/comments(.:format)     blogit/comments#create
 post_comment DELETE /posts/:post_id/comments/:id(.:format) blogit/comments#destroy
        posts GET    /posts(.:format)                       blogit/posts#index
              POST   /posts(.:format)                       blogit/posts#create
     new_post GET    /posts/new(.:format)                   blogit/posts#new
    edit_post GET    /posts/:id/edit(.:format)              blogit/posts#edit
         post GET    /posts/:id(.:format)                   blogit/posts#show
              PATCH  /posts/:id(.:format)                   blogit/posts#update
              PUT    /posts/:id(.:format)                   blogit/posts#update
              DELETE /posts/:id(.:format)                   blogit/posts#destroy
    blog_root GET    /                                      blogit/posts#index

【问题讨论】:

  • 对于任何疑问, :class=>('active' if (request.path.include? '/blog/') 可以作为一种解决方法,但并不理想。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

我对可安装引擎的了解有限。不过,我最近一直在看这个railscast,它可能会有所帮助。

接下来,您可能需要在路由文件中将as 选项传递给可挂载引擎,例如:

mount Blogit::Engine => "/blog", as: "blogit_engine"

然后,在您的主应用程序中,您的 blogit root 路径助手应该是:

blogit_engine.root_url

在您的情况下会导致:

<%= link_to "Blog", blogit_path, :class =>('active' if current_page?blogit_engine.root_url) %>

【讨论】:

  • 进行路由更改后 - blogit_path 是引擎外的未定义变量,引擎内模块的未定义方法。如果我将 blogit_path 更改为 blogit_engine_path,则链接有效。但是 blogit_engine.root_url 给出了一个未定义的方法错误。如果我将 blogit_engine.root_url 更改为 blogit_path 之类的东西 - 我们的行为与以前相同:没有错误,但从未应用活动类。
  • 我发现了同样的事情;范围界定问题?
  • 哦,我正在使用 Mercury,结果发现 Mercury 正在 iframe 中打开页面,所以路线不是我预期的那样。
猜你喜欢
  • 2011-12-27
  • 1970-01-01
  • 2016-01-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-25
  • 2012-10-26
相关资源
最近更新 更多