2014-12-03 117 views
0

我在Rails應用上有一個搜索頁面。 Search控制器根據模型中的查詢獲取空格,並將它們返回爲json。我使用$ .getJSON在視圖中獲取它們:JSON對象在Rails視圖中

搜索控制器:

respond_to :html, :js 

    def index 
    @spaces = Space.find_spaces(params) 
    end 

空間模型

def self.find_spaces(params = {}) 
    params ||= {} 
    spaces = Space.all 
    spaces = spaces.near(params[:location], 10) if params[:location].present? 
    # spaces = space.where("name LIKE ? ", params[:name]) if params[:name].present? 
    spaces = spaces.where("description LIKE %?%" , params[:description]) if params[:description].present? 
    spaces 
end 

腳本(瀏覽量/搜索/ index.html.erb)

$(document).ready(function() { 
    $("#search_form").submit(function() { 
     // clear out current results first 
     $('#spaces').empty(); 
     // fetch all results 
    $.getJSON("/search.json", $('#search_form').serialize()) 
    .done(function(data) { 
      $.each(data, function(key, space) { 
       $('#spaces').append("<h1>" + space.name + "</h1><p>" + space.description + "</p>"); 
      }); 
     }); 
    }).trigger('submit'); //this is to submit on page load if coming from home page 
}); 

這一切工作正常,我可以訪問JSON對象,並使用jquery在視圖中顯示它,並且它沒有重新更新如預期的那樣新鮮,根據表格/查詢得到正確的結果。

我的問題是關於在視圖中使用Json數據。

我正在做這個對嗎?看起來有點愚蠢,因爲現在我不能在我的視圖中使用任何Rails助手(例如鏈接助手),因爲它只是javascript/json對象。我不想最終追加一個可怕的HTML與對象id等創建鏈接。

有沒有一個合適的/更好的方法,我應該這樣做?我已經閱讀了文檔和一些其他教程,但沒有真正(完全)描述在視圖中處理返回的Json的最佳方式。我應該使用partials嗎? .js.erb文件?魔法?

感謝您的任何啓示!

回答

1

除了使用ajax來獲取JSON數據外,您實際上可以使用ajax來獲取整個呈現的HTML並簡單地將整個結果附加到#spaces中。首先在你的控制器創建一個新的動作

搜索控制器:

def result 
    @spaces = Space.find_spaces(params) 
end 

route.rb

match "search/result" => "search#result" 

那麼你的觀點的意見/搜索/ result.html.erb

<% @spaces.each do |space| %> 
<h1><%= space.name %></h1><p><%= space.description %></p> 
<% end %> 

現在你可以使用ajax從rails獲取渲染的視圖,並使用javascript

$(document).ready(function() { 
    $("#search_form").submit(function() { 
     $('#spaces').empty(); 
     $.get("/search/result", $('#search_form').serialize()) 
     .done(function(search_result_html) { 
      $("#spaces").html(search_result_html); 
     }); 
    }).trigger('submit'); //this is to submit on page load if coming from home page 
}); 

這樣,你在渲染視圖/搜索/ result.html.erb和使用任何軌幫手你想

+0

感謝這一切,很好地解釋。在文檔中沒有任何地方能真正詳細描述這種流程。 – 2014-12-18 10:52:07