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

ただし、コードがまだ奇妙に見えることに注意してください。:js に html-fragment で応答しますか?

于 2012-09-28T17:55:49.337 に答える