2013-03-01 49 views
4

我想發佈一些數據作爲html屬性。假設有一個導軌變量在html屬性中發佈數據時引用浩瀚的報價

@fields = [{:name => "id", :type => :integer}] 

我想在頁面中發佈使用jQuery的.data()。所以在.html.erb我

<%= form_tag({:action => 'whatever'}, {... , :"data-fields" => h(@fields.to_json)}) %> 

但同時渲染,在字符串中的報價[{"name":"id","type":"integer"}]弄亂由於Rails的form_tag使用雙引號的其他屬性用雙引號括整個JSON字符串。如何將json與字符串一起作爲Rails的屬性發布?

回答

0

你試過以下嗎?

<%= form_tag { :action => "whatever" }, { :data => { :fields => h(@fields.to_json) } } %> 
+0

這產生了與我的問題 – highBandWidth 2013-03-01 23:08:12

0

下面是我回避這一問題:

在表單標籤,我做了:"data-fields" => @fields.to_json.gsub('"',"'")

這會產生這種HTML:

"data-fields"="[{'name':'id','type':'integer'}]" 

然後,在JS,我找回它是這樣的:

$.parseJSON($('form').data('fields').replace(/'/g,'"')) 
+1

相同的問題我知道這可能有點「副業」,但是你有沒有考慮過將json文件中的每個項目作爲單獨的數據字段?例如。 「數據ID」和「數據類型」。我將此發佈爲評論,因爲它不是您的問題的答案,但仍然是解決您的問題的可能方案。我只是想,當你可以尋找更簡單的解決方案時,你可能會過度複雜化這個問題。我絕不會說我的是一個完美的... – 2013-03-03 21:03:42

+0

它;在這種情況下,我有一個數組''{id:1,type:a},{id:2,type: z},...]'所以我可以創建兩個數組,然後使用索引來鏈接它們。在一般情況下,應該有一種附加有效的json屬性的方法。 – highBandWidth 2013-03-05 17:12:28

+0

從技術上講,你是對的。它應該是可能的。然而,從邏輯上講,這不是經常發生的事情,所以它可能沒有跨過他們的想法大聲笑。如果你確實搞清楚了,請告訴我們。這非常有用:P – 2013-03-05 18:42:33

0

你試過escape_javascript?雖然它有known downsides,但它並不完全是用於轉義JSON,而且我不確定轉義引號是否可用於HTML屬性。

0

有一個episode on railscasts使用序列化器解決你的情況。重點是序列化器用$「」替換雙引號。 serialuzer還使您能夠選擇要序列化和包含關聯的屬性。

+0

序列化器用於主動記錄。我如何簡單地寫一個軌道散列/數組的json,就像erb文件中的問題一樣? – highBandWidth 2013-03-11 18:28:55

0

經過一些試驗和錯誤,這是什麼工程。

服務器端:

<% @fields = [{:name => "id", :type => :integer}] %> 
<%= form_tag('/posts/new', {id:'example',:data => { :fields=>@fields}}) %> 

生成的HTML:

<form accept-charset="UTF-8" action="/posts/new" data-fields="[{&quot;name&quot;:&quot;id&quot;,&quot;type&quot;:&quot;integer&quot;}]" id="example" method="post"> 

室內用的Javascript JQuery的數據的方法

fields = $('#example').attr('data-fields') 

我使用的鐵軌2.3.8和jQuery護欄2.2 .1

+0

不適合我。生成的HTML是

'雙引號無處不在,因此瀏覽器將其解釋爲' – highBandWidth 2013-03-13 16:58:27

+0

你能否粘貼你的視圖中的確切代碼。 – Andreyy 2013-03-13 17:50:36