0

我有以下控制器代码:

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>在列表的前面和末尾包含标签。

非常感谢你的帮助

4

3 回答 3

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

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

format.js { render :js => "<ul>#{@nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}.join}</ul>" }
于 2012-09-28T17:54:09.547 回答
1

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

format.js { render :js => "<ul>" + (@nodes.map { |node|  "<li>#{node.COMPONENT_NAME}</li>"}).to_s + "</ul>" }
于 2012-09-28T17:52:28.493 回答
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-fragment 回应你的 :js 吗?

于 2012-09-28T17:55:49.337 回答