为什么我的 content_tag 没有产生我期望的 HTML?

Why does my content_tag not produce the HTML I expect?

我正在渲染我的 Profiles#Index 视图。在那个视图中,我调用这个辅助方法:

<%= ratings_labels(profile, params[:rating]) %>

就是在profiles_helper.rb中定义的,像这样:

def ratings_labels(profile, rating_param)
    rating_classes = {
      'speed'     => 'label label-success label-lg',
      'tackling'  => 'label label-info label-lg',
      'passing'   => 'label label-warning label-lg',
      'dribbling' => 'label label-primary label-lg'
    }

    rating_classes.each do |rating, klass|


      content_tag :div, class: "col-lg-3" do
        content_tag :span, class: "#{klass}" do
          "#{rating.capitalize}: #{profile.ratings.find_by(user: current_user)[rating]}"
        end
      end
    end

     end
  end

然而,我的 HTML 中的输出是这样的:

{"speed"=&gt;"label label-success label-lg", "tackling"=&gt;"label label-info label-lg", "passing"=&gt;"label label-warning label-lg", "dribbling"=&gt;"label label-primary label-lg"}

注意没有生成 HTML。没有 div.col-lg-3span

这是为什么?

试试这个,应该有用

  def ratings_labels(profile, rating_param)
    rating_classes = {
        'speed'     => 'label label-success label-lg',
        'tackling'  => 'label label-info label-lg',
        'passing'   => 'label label-warning label-lg',
        'dribbling' => 'label label-primary label-lg'
    }

    markup = ''

    rating_classes.each do |rating, klass|
      markup << content_tag(:div, class: "col-lg-3") do
        content_tag :span, class: "#{klass}" do
          "#{rating.capitalize}: #{profile.ratings.find_by(user: current_user)[rating]}"
        end
      end
    end

    markup.html_safe

  end

您必须记录单个循环的输出并聚合以获得所需的输出。此外 html_safe 使您的字符串成为 clean 在浏览器中呈现为有效 HTML.

Notice there is no HTML generated. No div.col-lg-3 or span.

您的辅助方法正在返回散列 rating_classes,因为它是方法中的最后一条语句(ruby 您看到的功能)。渲染时 ruby 在每个对象中执行 .to_s 方法。