我有以下控制器代码:
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>
标记。
非常感谢你的帮助
答案 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?