Rails Helper VS partial给出不同的结果

时间:2013-06-19 02:03:27

标签: ruby-on-rails partial-views helper

我有部分:

<% if title_top.any? %>
    <% title_top.each do |country| %>
        <li><%= link_to country.title, country%></li>
    <% end %>
    <li class="divider"></li>
<% end %>

它工作正常并生成带链接的列表标签,但我想用帮助器替换它:

def link_to_list(var)
  if var.any?
    var.each do |country|
      content_tag :li do
        link_to(country.title, country)
       if var.first.top?
        content_tag(:li, class: "divider")
       end    
      end
    end
  end
end

参数的国家/地区数组:

def title_top
   @country_top = Country.where(top: true)
end

帮助器不起作用,在控制台中它给了我:

ArgumentError: arguments passed to url_for can't be handled. Please require routes or provide your own implementation  

我错了,请帮忙...我可以放弃它,但我的大脑很快就会爆炸,因为我找不到合适的解决方案

感谢juanpastas , 对我来说,正确答案是:

def link_to_list(var)
out = ''
devider ="<li class='divider'></li>" #divider for bootstrap menu
  var.each do |country|
    out += content_tag :li do        #list item with links inside 
       link_to country.title, country
    end
  end
   var.first.top ? (out << devider).html_safe  : out.html_safe #divide upper menu links from other links
end

(但我仍然无法理解为什么以前的方法不起作用)

2 个答案:

答案 0 :(得分:0)

这就是我在评论中的意思

out = ''
var.each do |country|
  out += content_tag :li do
    out1 = link_to 'blah', 'route'
    if something
      out1 += content_tag :li
    end
    out1
  end
end
out

答案 1 :(得分:0)

要使用控制台中的路径助手调用辅助方法,您应该执行以下操作:

irb(main):006:0* include Rails.application.routes.url_helpers
=> Object
irb(main):007:0> ApplicationController.helpers.bogus(Thing.first)
  Thing Load (1.0ms)  SELECT "things".* FROM "things" LIMIT 1
=> "<li><a href=\"/things/2\">Thing</a></li>"

接下来,你的助手不会给你你想要的东西。正如juanpastas所说,你需要连接content_tag的输出。我这样做(注意这相当于你的初始部分代码,而不是帮助者):

def link_to_list(list)
  html = ""
  unless list.empty?
    html += list.map { |item| content_tag(:li, link_to(item.title, item)) }.join.html_safe
    html += content_tag(:li, :class => "divider")
  end
  html
end