我有一个非常简单的问题。我有一页报告,每个报告都有自己的标签。我正在使用current_page?
来确定应突出显示哪个标签。当我提交任何报告时,current_page?
似乎不再起作用,显然是因为请求方法是POST
。
这是current_page?
的预期行为吗?我很难想象为什么会出现这种情况。如果是的话,人们通常如何解决这个问题?
以下是current_page?
电话的示例:
<li><%= link_to "Client Retention", reports_client_retention_path, :class => current_page?(reports_client_retention_path) ? "current" : "" %></li>
答案 0 :(得分:11)
好吧,看起来我在提出赏金后约5分钟就找到了自己问题的答案。看起来current_page?
将始终在POST
上返回false。
以下是current_page?
的源代码:
# File actionpack/lib/action_view/helpers/url_helper.rb, line 588
def current_page?(options)
unless request
raise "You cannot use helpers that need to determine the current " "page unless your view context provides a Request object " "in a #request method"
end
return false unless request.get?
url_string = url_for(options)
# We ignore any extra parameters in the request_uri if the
# submitted url doesn't have any either. This lets the function
# work with things like ?order=asc
if url_string.index("?")
request_uri = request.fullpath
else
request_uri = request.path
end
if url_string =~ %r^\w+:\/\//
url_string == "#{request.protocol}#{request.host_with_port}#{request_uri}"
else
url_string == request_uri
end
end
我真的不明白为什么他们会尽力让current_page?
仅针对GET
请求工作,但至少现在我知道这就是它的方式。
答案 1 :(得分:2)
您可以在current_path?
中创建新的ApplicationHelper
方法:
def current_path?(*paths)
return true if paths.include?(request.path)
false
end
传递一个或多个路径,如果匹配用户的当前路径,则返回true:
current_path?('/user/new')
current_path?(root_path)
current_path?(new_user_path, users_path '/foo/bar')
或者,您可以创建一个新的current_request?
辅助方法来检查Rails控制器+操作:
def current_request?(*requests)
return true if requests.include?({
controller: controller.controller_name,
action: controller.action_name
})
false
end
传递一个或多个控制器+动作,如果与用户的当前请求匹配则返回true:
current_request?(controller: 'users', action: 'new')
current_request?({controller: 'users', action: 'new'}, {controller: 'users', action: 'create'})
<强> == UPDATE == 强>
好的,我决定在你试图匹配多个动作时不要求你输入控制器,从而使current_request?
更加冗长:
def current_request?(*requests)
requests.each do |request|
if request[:controller] == controller.controller_name
return true if request[:action].is_a?(Array) && request[:action].include?(controller.action_name)
return true if request[:action] == controller.action_name
end
end
false
end
现在你可以这样做:
current_request?(controller: 'users', action: ['new', 'create'])
答案 2 :(得分:0)
使用POST
时遇到了同样的问题。我的解决方案是做这样的事情
def menu_item link_text, link_path
link_class = (request.original_url.end_with? link_path) ? 'active' : ''
content_tag :li, link_to(link_text, link_path), class: link_class
end
其中link_path
只是url_for(action: 'action', controller: 'controller')