无法将Array转换为String - 添加<ul>标记</ul>

时间:2012-09-28 17:46:36

标签: ruby-on-rails ruby

我有以下控制器代码:

class NodesController < ApplicationController

  def index
    @nodes = Node.com_name_scope("27").find(:all, :conditions => ['COMPONENT_NAME LIKE ?', "#{params[:search]}%"])

    respond_to do |format|
      format.js {render :js => @nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}}
    end
end

当我这样做时:

http://localhost/myproject/nodes.js

我得到以下列表:

<li>Value A</li>
<li>Value B</li>
<li>Value C</li>
<li>Value D</li>

我想在列表的开头和结尾插入<ul>标记,使其如下所示:

<ul>
<li>Value A</li>
<li>Value B</li>
<li>Value C</li>
<li>Value D</li>
</ul>

但是当我这样做时:

format.js {render :js => "ul" + @nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}+ "</ul>" }

它给出了以下错误消息:

 TypeError in NodesController#index

can't convert Array into String

我的问题是如何在列表的前面和末尾添加<ul>标记。

非常感谢你的帮助

3 个答案:

答案 0 :(得分:2)

@nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}

返回一个字符串数组,在将它们与字符串合并之前,需要以某种方式连接它们。

format.js { render :js => "<ul>#{@nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}.join}</ul>" }

答案 1 :(得分:1)

您需要将数组@nodes.map { }转换为字符串:

format.js { render :js => "<ul>" + (@nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}).to_s + "</ul>" }

答案 2 :(得分:1)

以下示例应该有效:

respond_to do |format|
  format.js do
    mapped = @nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}
    mapped.unshift "<ul>"
    mapped.push "</ul>"

    render :js => mapped
  end
end

但请注意,您的代码看起来仍然很奇怪。 你用一个html片段回复你的:js?