为什么这不适用于Ruby 1.9.2?

时间:2011-09-08 12:44:26

标签: ruby-on-rails ruby block

以下代码不适用于Ruby 1.9.2:

def side_box(title, &block)
  render :layout => 'layouts/side_box', :locals => {:title => title} do 
    &block
  end
end

我收到错误:

  

语法错误,意外的tAMPER         &安培;块

为了不起作用,发生了什么变化(自1.8.7起)?

4 个答案:

答案 0 :(得分:3)

def side_box(title, &block)
  render :layout => 'layouts/side_box', :locals => {:title => title} do 
    yield
  end
end

def side_box(title, &block)
  render :layout => 'layouts/side_box', :locals => {:title => title} do 
    block.call
  end
end

适用于Ruby 1.9和1.8。

答案 1 :(得分:2)

我目前没有安装1.8.7,但我很确定这在1.8.7中也是非法的。一元前缀&运算符仅在参数列表和参数列表中合法。

答案 2 :(得分:1)

在Simone的答案的基础上,如果您的块接受参数(arg1,arg2),正确的语法(在1.8和1.9中)将是

def side_box(title, &block)
  render :layout => 'layouts/side_box', :locals => {:title => title} do 
    yield(arg1, arg2)
  end
end

def side_box(title, &block)
  render :layout => 'layouts/side_box', :locals => {:title => title} do 
    block.call(arg1, arg2)
  end
end

答案 3 :(得分:0)

我不知道,这在1.8.7中有效,正确的语法应该是

block.call

block[]

render :layout => 'layouts/side_box', :locals => {:title => title}, &block