Rails 当前 URL 帮助程序

6

非常抱歉这是一个如此简单的问题,但是由于我对RoR的知识基本上是零,所以我自己无法解决它。在我正在使用的Rails应用程序中,已经使用了导航帮助程序来突出显示活动菜单:

  def nav_link(link_text, link_path, ico_path)
    class_name = current_page?(link_path) ? 'active' : nil

    content_tag :li do
      link_to(link_path, class: class_name) do
        image_tag("icons/#{ico_path}.svg") + content_tag(:span, link_text)
      end
    end
  end

情况已经发生了变化,current_page?不再是一种可行的选择,因为路由现在在前端处理。是否有一种方法可以通过检索当前url并将其与link_path进行比较来实现相同的功能?我尝试过很多东西,使用不同的帮助程序,如request.original_url,但都没有成功。


你有没有什么理由不能检查当前控制器?例如,我使用controller.class == GraphsController来突出显示导航项,但我可能误解了你的问题。 - Undo
@Undo,我真的一无所知,但常识告诉我,我需要像current_controller这样的帮手才能使它工作。或者硬编码每个菜单的每个状态为“活动”。 - curious_gudleif
3个回答

11

request.original_url应该按照文档正常工作。

返回原始请求URL字符串

http://apidock.com/rails/ActionDispatch/Request/original_url

你可以尝试使用不同的变量进行字符串拼接。
request.host + request.full_path

如果那也不起作用,您可以尝试使用 url_for(:only_path => false)

不是说它不起作用,我真的只是不知道如何在我的辅助函数中加入它。据我理解,current_page接受link_path作为参数,并且使用?运算符来获取布尔值,并将active赋值给class_name变量(如果为真)。request.original_urlurl_for(:only_path => false)不接受参数,但我认为它确实返回一个URL,只是我没有正确使用它。感谢你的建议,@RichardHamilton - curious_gudleif
相关提示:谨慎地将用户生成的输入与 only_path: false 使用 url_for 的结果重定向,因为这会使您容易受到开放式重定向攻击。例如,当恶意用户向其受害者发送 /foo/bar/?host=www.example.com 的链接时,Rails 将把他们重定向到 www.example.com。 - Dennis Hackethal


2

您需要查看active_link_to宝石:

def nav_link(link_text, link_path, ico_path)
    content_tag :li do
      active_link_to link_path do
        image_tag("icons/#{ico_path}.svg") + content_tag(:span, link_text)
      end
    end
end

current_page?助手不同,active_link_to使用控制器操作和模型对象来确定您是否在特定页面上。 current_page?仅针对当前路径进行测试,如果您处理晦涩或ajax化的路由,则会暴露出问题。
我原本打算写一下current_page?是如何工作的等等,但既然您提到它不可行,那我就不写了。不过我还是要问一下为什么它不可行...

现在前端处理路由。

即使您使用像Angular with Rails这样的东西,您也必须为应用程序设置路由,对吗?

我正在使用Backbone在页面之间进行导航,所有路由都在routes.rb中正确声明和作用域限定,但实际路由现在是通过JS执行的,因此与Rails的唯一交互是相关路由上的GET请求。我本来想将这个逻辑也移到Backbone中,但是这个菜单包含了最好留在erb中处理的内容,如授权处理等。活动链接已经起作用(它在第一次加载时分配了“active”),但它不响应GET请求。也许我正在尝试做的事情根本无法实现?@RichPeck - curious_gudleif

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接