我正在尝试将数据(jQuery ajax)发布到我的控制器中的自定义方法,以便我可以构建动态数据库查询,我从下拉菜单中获取值并将它们用作我的搜索查询。
我的方法
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);
}
});
});
例如,如果用户选择“Cat&#39;从下拉菜单中,我的方法的查询应该是
Animal.where(animal_type: 'Cat')
目前正在执行的查询是
SELECT "animals".* FROM "animals"
这只是选择每一只动物
我如何实现这一目标?我在{render :json => {} }
我试图弄清楚如何把所有这些放在一起,任何指针都会受到赞赏
由于
答案 0 :(得分: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
注意我没有调用#to_json
,因为render :json
会将查询结果转换为json。
答案 1 :(得分: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