Rails link_to_if问题

时间:2011-02-11 01:35:42

标签: ruby-on-rails switch-statement

我有一个帮助方法,根据用户所在的当前页面生成指向某个路径的链接。基本上,站点范围内的链接应指向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

2 个答案:

答案 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