2014-10-30 71 views
0

我試圖將數據(jQuery ajax)發佈到我的控制器中的自定義方法,以便我可以構建動態數據庫查詢,我從下拉菜單中獲取值並將它們用作我的搜索查詢。將屬性傳遞給方法jquery和rails

我的方法

class PublicController < ApplicationController 

    def rehomed(query={}) 
    Animal.where(query).to_json 

    respond_to do |format| 
    format.js {render :json => {} } 
    end 
    end 

end 

Ajax調用

$('select.btn').on('change', function() { 
var animal_type = $('#animalType option:selected').text(); 
var animal_town = $('#animalTown option:selected').text(); 

$.ajax({ 
    type: 'POST', 
    url: '/public/rehomed', 
    data: { 
    animal_type: animal_type 
    }, 
    success: function(data) { 
    console.log(data); 
    } 
}); 
}); 

因此,作爲一個例子,如果從下拉菜單中用戶選擇 '貓',離我的方法查詢應該是

​​

此刻它正在執行的查詢是

SELECT "animals".* FROM "animals" 

這是剛剛選擇每一種動物

我如何做到這一點?我該怎樣通過內{render :json => {} }

我試着去弄清楚如何把這個一起,任何指針將不勝感激

感謝

+0

我不知道你的動作定義(接受查詢參數),但你有沒有嘗試過:'Animal.where(params)'來查看是否執行了正確的查詢? – Alireza 2014-10-30 10:44:24

回答

1

你需要收集和傳遞的查詢結果。使用params從請求中獲取參數信息。

def rehomed 
    @animals = Animal.where(animal_type: params[:animal_type]) 

    respond_to do |format| 
    format.js {render :json => @animals } 
    end 
end 

或者在一行

def rehomed 
    respond_to do |format| 
    format.js {render :json => Animal.where(animal_type: params[:animal_type])} 
    end 
end 

注意鑑於render :json將查詢結果轉換成JSON我不打電話#to_json

+0

它不起作用,因爲控制器中的'query'只有一個空的散列,這意味着OP將最終具有當前查詢:SELECT動物。* FROM問題中提到的「animals」。 – Surya 2014-10-30 10:46:41

+0

你說得對。我修正了這個例子。 – 2014-10-30 10:47:37

1

更改了jQuery這樣的:

$('select.btn').on('change', function() { 
var animal_type = $('#animalType option:selected').text(); 
var animal_town = $('#animalTown option:selected').text(); 

$.ajax({ 
    type: 'POST', 
    url: '/public/rehomed', 
    data: { 'query': { 'animal_type': animal_type } }, // or 'name': animal_name etc 
    success: function(data) { 
    console.log(data); 
    } 
}); 
}); 
在控制器

則:

class PublicController < ApplicationController 

    def rehomed 
    respond_to do |format| 
    format.js { render :json => Animal.where(params[:query]) } 
    end 
    end 

end 

注:查詢如上圖所示可能會打開一個嚴重的安全問題,所以,除非你有不這樣做很強烈的理由,或者你知道你在做什麼。

如果你不改變上面顯示的jQuery的,那麼你將不得不獲取params中這樣介紹你的控制器內提交的值:

def rehomed 
    respond_to do |format| 
    format.js { render :json => Animal.where(:animal_type => params[:animal_type]) } 
    end 
    end 
+0

您應該過濾您的查詢,傳遞完整的查詢對象可能會打開安全問題。事實上,你將能夠傳遞一個字符串,並將它注入到WHERE子句中。 – 2014-10-30 10:49:55

+0

我同意。你不能相信在互聯網上提交給你的參數。我會寫一個筆記。謝謝。 – Surya 2014-10-30 10:52:34

+0

謝謝你們,這真的有很大的幫助。 – Richlewis 2014-10-30 11:03:39