2013-02-25 21 views
0

我有一個隱藏的表單這樣解析陣列當我嘗試從存儲在PARAMS此ATTR哈希保存記錄:西納特拉不是從PARAMS

{"title"=>"Iron Man 2", 
"directors"=>"[\"Jon Favreau\"]", 
"cast_members"=>"[\"Robert Downey Jr.\", \"Gwyneth Paltrow\", \"Don Cheadle\", \"Scarlett Johansson\", \"Sam Rockwell\"]", 
"genres"=>"[\"Action\", \"Adventure\", \"Sci-Fi\"]", 
"length"=>"124", 
"trailer_url"=>"http://imdb.com/video/screenplay/vi1172179225/", 
"year"=>"2010", 
"languages"=>"[\"English\", \"French\", \"Russian\"]"} 

我可以用這個代碼醜陋塊解析字符串數組210

Movie.serialized_attributes.keys.each do |k| 
    movie[k] = movie[k].gsub(/\"|\[|\]/, '').split(', ') if movie[k] 
end 

但這似乎只是愚蠢的,sinatra應該自動解析它(或不?),或者我可能會產生錯誤的方式。 我該如何解決這個問題?

注:只是試圖產生這樣的形式:

- Movie.attribute_names.each do |attr| 
    - if Movie.serialized_attributes.keys.include? attr 
    = f.hidden_field attr.to_sym, value: movie.send(attr), multiple: true 
    - else 
    = f.hidden_field attr.to_sym, value: movie.send(attr) 

回答

0

我希望保持LOC和可讀性的最佳水平,所以周圍的工作與AJAX:

= link_to 'Save this movie', class: 'button', id: "create_movie_#{movie_id}" 
- content_for :scripts do 
    :javascript 
    $(function(){ 
     $('#create_movie_#{movie_id}').on('click', function(){ 
     $.post("/movies/create.json", 
     {movie: #{movie.to_json}}, 
     function(r){ 
      console.log('Response arrived:') 
      console.log(r) 
     }) 
     }) 
    }) 

# controller.rb 
post :create, provides: [:html, :json] do 
    case content_type 
    when :json 
    Movie.create(params[:movie]).to_json 
    when :html 
    if @movie = Movie.create(params[:movie]) 
     render 'movies/show' 
    else 
     redirect 'movies/fetch', error: 'Something went wrong' 
    end 
    end 
end 
1

我的建議是操縱好清楚在數組和哈希的形式發送的數據。您嘗試發送的數據可以很容易地作爲一個字符串發送,然後在另一側分開。例如,爲什麼不發送演員成員作爲一個逗號分隔的字符串,然後收到param["cast_members"].split(/\s*,\s*/)?某種類型的自動提示將是謹慎的,否則最終會出現大量拼寫錯誤的名稱。這將幫助您進一步分隔數據,方法是在發送數據之前用段落替換條目。看看StackOverflow做標記字段的方式。

如果你真的需要發送數組,請考慮將它轉換爲JSON,然後發送它並在另一端進行反序列化,而不是自己做。

+0

我希望有一些助手,以便傳遞數組對象作爲輸入值會自動生成正確的隱藏輸入。與阿賈克斯一起工作。 – nicooga 2013-02-25 19:46:25