在学习Ruby、Sinatra和从事一个项目时,出现了收益率错误
在我的项目中,我有几个文件: 1。main.rb在学习Ruby、Sinatra和从事一个项目时,出现了收益率错误,ruby,sinatra,Ruby,Sinatra,在我的项目中,我有几个文件: 1。main.rb require 'sinatra' set :public_folder, 'public' set :views, 'views' set :erb, :layout => :base get '/' do erb :layout end get '/about' do erb :about end get '/contact' do erb :contact end 2。布局.erb require 'sinatra' set :
require 'sinatra'
set :public_folder, 'public'
set :views, 'views'
set :erb, :layout => :base
get '/' do
erb :layout
end
get '/about' do
erb :about
end
get '/contact' do
erb :contact
end
2。布局.erb
require 'sinatra'
set :public_folder, 'public'
set :views, 'views'
set :erb, :layout => :base
get '/' do
erb :layout
end
get '/about' do
erb :about
end
get '/contact' do
erb :contact
end
-
-
-
欢迎来到这个关于伟大的弗兰克·西纳特拉的歌曲的网站
您需要传入一个块
erb :layout
要使layout.erb
中的
正常工作,您需要传递一个块,该块的输出将放置在'yield'位置。以最简单的形式,您可以执行以下操作:
erb :layout { "This is what I want in output" }
通常,渲染另一个模板:
erb :layout do
erb :about
end
更多详情请参见。TLDR;@wandmaker所说的-您需要将一个块传递给:布局 理解
yield
对于理解Ruby是至关重要的。基本上,yield
将控制权从一个作用域传递到另一个作用域。Ruby中的所有方法都接受块,但它们会忽略它们,除非它们显式地产生或调用它们:
"A RUBY STRING".downcase { p "I'm in a block!" }
# => "a ruby string"
但如果该方法调用yield,则控制权将传递给块,然后再传递回调用范围:
def yield_me
yield
end
yield_me { p "I'm in a block!" }
# => "I'm in a block!"
或者,您可以将块捕获为参数:
def catch_me(&block)
block.call
end
catch_me { p "I'm in a block" }
# => "I'm in a block!"
因此,记住这一点,您的Sinatra模板应该会更清楚地执行什么操作-它呈现layout.erb,但当它点击yield
,它会尝试将控制权让给一个块-在本例中是一个不存在的块
因此,您的所有回复都应提供一个块或子模板,如:
erb :layout { "<p>This is the about page</p>" }
为什么这个标签是“ruby on rails”?对不起,我错了,我没看到。