2016-01-11 90 views
3

对于这样一个简单的问题抱歉,但自从我的RoR知识基本上不存在以来,几个小时后我无法自己解决它。在我工作的Rails应用程序,已经使用了导航帮助,突出活动的菜单: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?不再是一个可行的选择,因为现在工艺路线的前端处理。有没有办法通过检索当前网址来实现相同的功能,并根据link_path?进行检查。我用request.original_url等不同的帮手试了很多东西,但无济于事。

+0

是否有任何理由不能对照当前的控制器?即我使用'控制器。class == GraphsController'来突出显示导航项目,但可能我误解了你的问题。 – Undo

+0

@Undo,我真的在这里黑暗,但常识告诉我,我需要一个像'current_controller'这样的助手才能使它工作。或者单独硬编码每个菜单的每个“活动”状态。 –

回答

5

request.original_url应根据文档工作。

返回原始请求URL作为一个字符串

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

您也可以尝试用不同的变量字符串连接。

request.host + request.full_path 

如果这也不行,你可以尝试

url_for(:only_path => false);

+0

这并不是说它不起作用,我真的不知道如何将它融入到我的帮手中。据我了解'current_page'接受'link_path'作为参数,'?'操作符用于检索布尔值,并且如果为'true',则将'active'分配给'class_name'变量。 'request.original_url'或'url_for(:only_path => false)'不接受任何参数,但我认为它确实返回一个URL,我只是不正确地使用它。感谢您的输入,@RichardHamilton –

1

你会想看看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?只针对当前路径进行测试,如果您处理模糊或不正确的路由,则会让您暴露。

-

我打算写关于如何current_page?作品等,但既然你提到它是不能存活的,我不会。我不得不怀疑为什么它虽然不能存活......

路由现在的前端处理。

当然,即使您使用Angular with Rails之类的东西,您也必须为您的应用设置路由?

+0

我正在使用Backbone在页面之间导航,所有路由都在routes.rb中声明和范围正确,但实际路由现在通过JS执行,所以与Rails的唯一交互是GET请求相关路线。我也会把这个逻辑转移到Backbone上,但是这个菜单包含了更好的东西,比如'erb',授权处理等等。活动链接已经工作(它在第一次加载时分配“活动”),但它不响应GET请求。也许我想要做的只是无法实现? @RichPeck –