我试图使我的页面动态,基于URL传递的参数。我想用PARAMS改变变量这样在可变轨道插值
<h3><%= "$subproject_title_#{params[:num]}_1" %></h3>
显然,这只是打印字符串,但如果我删除引号,一半的线刚刚被注释掉。 这样做的正确方法是什么?
我试图使我的页面动态,基于URL传递的参数。我想用PARAMS改变变量这样在可变轨道插值
<h3><%= "$subproject_title_#{params[:num]}_1" %></h3>
显然,这只是打印字符串,但如果我删除引号,一半的线刚刚被注释掉。 这样做的正确方法是什么?
eval("$subproject_title_#{params[:num]}_1")
'eval'是一个非常强大的工具。除非你真的知道你在做什么,你应该避免它。该特定的代码易受代码注入的影响。例如,将':num'设置为''“; _1 ='ls';”''会让你的视图打印一个目录列表。 – Stefan
一些经验法则:
eval
此外,尝试为避免在您的视图中访问params
,应该在控制器中进行处理。
除了全局变量,您可以使用实例变量。它们在你的控制器和你的视图之间共享。
而是动态生成的变量,你可以使用一个哈希:
@titles = {
'1' = 'title one',
'2' = 'title two',
'3' = 'title three',
}
然后,而不是eval
,您可以使用Hash#fetch
为给定num
取一个值。
您可以在值赋给一个实例变量在你的控制器:
def index
@title = @titles.fetch(params[:num], 'default title')
end
该实例变量就可以在你访问查看:
<h3><%= @title %></h3>
您还可以创建一个Page
模型与title
和(唯一)num
属性存储您的页面详细信息。到控制器的变化将是相当简单:
def index
@page = Page.find_by(num: params[:num])
end
而在你的看法:
<h3><%= @page.title %></h3>
'public_send( “$ subproject_title _#{PARAMS [:NUM]} _ 1”)' –
@AndreyDeineko那给我一个未定义的方法错误。 – JustusP
你可以使用'实例变量'而不是全局吗? –