2017-06-15 54 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>