将属性传递给方法jquery和rails

时间:2014-10-30 10:23:25

标签: javascript jquery ruby-on-rails ajax

我正在尝试将数据(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 => {} }

中传递了什么

我试图弄清楚如何把所有这些放在一起,任何指针都会受到赞赏

由于

2 个答案:

答案 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