我有一个帮助方法,根据用户所在的当前页面生成指向某个路径的链接。基本上,站点范围内的链接应指向items_path,除非用户在用户页面上。所以,我正在尝试制定一些DRY逻辑,但我一直遇到麻烦:
def items_link(title, options = {}, html_options = {})
path = request.path
case path
when users_path,items_path
options = request.parameters.merge(options)
end
link_to_if(path == users_path, title, users_path(options), html_options) do
link_to(title, items_path(options), html_options)
end
end
使用此解决方案,items_path会抛出No route matches
错误,尽管路径正确。 users_path工作正常,直到我使用link_to切换link_to_if路径。
link_to_if(path == items_path, title, items_path(options), html_options) do
link_to(title, users_path(options), html_options)
end
所以我猜我的问题出在link_to_if的某个地方。我接近了吗?我目前的工作解决方案是:
def items_link(title, options = {}, html_options = {})
path = request.path
case path
when users_path
options = request.parameters.merge(options)
link_to(title, users_path(options), html_options)
when items_path
options = request.parameters.merge(options)
link_to(title, items_path(options), html_options)
else
link_to(title, users_path(options), html_options)
end
end
这很好用,它只是丑陋。
更新
我花了一些时间,并认为我不得不将它分解出来,这实际上帮助了我在另一个领域,我喜欢有link_action助手。
def items_link(title, options = {}, html_options = {})
link_to(title, items_link_action(options), html_options)
end
def items_link_action(options = {})
path = request.path
case path
when users_path,items_path
options = request.parameters.merge(options)
end
if path == users_path
users_path(options)
else
items_path(options)
end
end
答案 0 :(得分:0)
将相同选项投入任一链接是否有意义?这可能是您的No Route Matches错误的来源。
我会看看current_page吗? helper和link_to_unless_current助手。
这样的事情会显示用户索引操作的链接,除非它们已经在用户索引操作中。对于项目页面也可以这样做。不确定这是否是你想要的。如果是我,我只会在我的布局中删除两个链接或共享部分:
<%= link_to_unless_current "Users", users_path %>
<%= link_to_unless_current "Items", items_path %>
答案 1 :(得分:0)
这跟我一样接近,我认为效果很好。
def items_link(title, options = {}, html_options = {})
link_to(title, items_link_action(options), html_options)
end
def items_link_action(options = {})
path = request.path
case path
when users_path,items_path
options = request.parameters.merge(options)
end
if path == users_path
users_path(options)
else
items_path(options)
end
end