2017-06-15 55 views
-1

我试图使我的页面动态,基于URL传递的参数。我想用PARAMS改变变量这样在可变轨道插值

<h3><%= "$subproject_title_#{params[:num]}_1" %></h3> 

显然,这只是打印字符串,但如果我删除引号,一半的线刚刚被注释掉。 这样做的正确方法是什么?

+0

'public_send( “$ subproject_title _#{PARAMS [:NUM]} _ 1”)' –

+0

@AndreyDeineko那给我一个未定义的方法错误。 – JustusP

+0

你可以使用'实例变量'而不是全局吗? –

回答

-2
eval("$subproject_title_#{params[:num]}_1") 
+1

'eval'是一个非常强大的工具。除非你真的知道你在做什么,你应该避免它。该特定的代码易受代码注入的影响。例如,将':num'设置为''“; _1 ='ls';”''会让你的视图打印一个目录列表。 – Stefan

3

一些经验法则:

  • 不要使用全局变量
  • 不要构建变量动态
  • 不要使用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>