在rails helper

时间:2016-09-16 13:26:59

标签: ruby-on-rails ruby

我正在尝试创建一个Rails帮助程序,它使用一个块并循环生成:

<span data-param1="param1" data-param2="param2">
    <span data-options="test">
    <span data-options="test">
</span>

正在使用的助手的一个例子:

<%= main(param1, param2) do %>
<%= sub('param', :options => 'test') %>
<%= sub('param', 'test') %>
<% end %>

然后是助手本身:

module MyHelper

  def main(param1, param2, &block)
    raise ArgumentError.new('Missing block!') unless block_given?
    content_tag :span, :data => { :param1 => param1, :picture => '' } do
      markup = content_tag(:span, '', :data => { :param2 => param2 }).to_s

      #loop through blocks of subs
      &block.each do |item|
        sub = sub(item.param, item.options)
        data = { :param => param }
        data[:options] = sub.options unless sub.options.blank?
        markup << content_tag(:span, '', :data => data).to_s
      end

    markup
  end

  private

  def sub(param, options = {})
    options = extract_options!(options)
  end

  # returns a string
  def extract_options!(options)
    when String
      options
    when Hash
      #removed for this question
    else
      raise ArgumentError.new('Only Hash && String allowed!')
  end

end

注意:我已删除了extract_options中的Hash处理,以使问题代码保持简短。

然而,它不喜欢&block循环并给出此错误:

syntax error, unexpected &, expecting keyword_end
      &block.each do |item|
       ^

1 个答案:

答案 0 :(得分:1)

首先,block基本上是一个each实例,main不是任何意味着实现def main(param1, param2, *subs) ... subs.each ... end <%= main(param1, param2, sub('param', :options => 'test'), sub('param', 'test')) %> ,因此在其上调用block将不会成功情况下。

我想知道,将数组传递给def main(param1, param2, &block) ... yield.each ... end <%= main param1, param2 do %> <%= [sub('param', :options => 'test'), sub('param', 'test')] %> <% end %> 有什么问题?你想要实现什么目标?

有效的代码示例:

List

您是否仍想使用WeatherChart(为什么?):

public void refreshWeatherCharts() {

    WeatherChartFetchData callbackservice = new WeatherChartFetchData(this) {
        @Override
        public void receiveData(boolean success) {
            if (success) {

                WeatherChartListBuilder.loadData();
                RecyclerView.Adapter adapter = ((RecyclerView) recyclerView).getAdapter();
                ((SimpleItemRecyclerViewAdapter) adapter).updateData(WeatherChartListBuilder.ITEMS);
            }
        }
    };

    callbackservice.execute(null, null, null);
}