【问题标题】:Rails Returning ActiveRecord::Relation as json to an ajax callRails 将 ActiveRecord::Relation 作为 json 返回到 ajax 调用
【发布时间】:2015-09-12 00:08:58
【问题描述】:

您好,我有一个 ajax 调用:

$.ajax({
            url: '<%= url_for( :controller => :users , :action => :search_user) %>',
            data: {search: $("#suchfeld").val()}
        })
                .done(function (data) {
                    alert(msg);
                })

现在我希望活动记录对象的控制器返回值将作为 json 对象返回。

我试过这个:

@users_search = User.where("lastname LIKE ?", "#{params[:search]}%").to_json

但我没有得到我想要得到的东西。

@users_search 是一个对象,所有用户都对应上述(工作)查询。

我得到了一些 HTML 代码 不是作为 json 对象的活动记录对象

我想要一个 json 对象,因为我想对其进行迭代

也试过这个:

                .done(function () {
                    var array = <%= @users_search.to_json %>;
                    alert(array);
                })

数组一直为空

编辑:

将代码更改为:

@userss = User.where("lastname LIKE ?", "#{params[:search]}%")

for user in @userss do
  @users_to_add << {:id => user.id, :lastname => user.lastname}
end

@users_search << {:results => @users_to_add}.to_json

数组在控制台中看起来像:

["{\"results\":[{\"id\":1,\"lastname\":\"Hohlwegler\"},{\"id\":2,\"lastname\":\"Hohlwegler\"},{\"id\":5,\"lastname\":\"Hohlwegler\"},{\"id\":6,\"lastname\":\"Hohlwegler\"},{\"id\":11,\"lastname\":\"Hohlwegler\"}]}"]

更新:

不得不改成这样:

 respond_to do |format|
  format.json { render :json => { :results => @userss.map{ |u| { :id => u.id, :lastname => u.lastname } } } }
end 

这将返回:[Object object]

                .done(function (arr) {
                     alert(arr);
                })

如果我做警报(arr[0].data);我无法读取未定义的数据

【问题讨论】:

  • 请在问题edit 中包含您对@users_search 的期望以及实际情况。
  • 添加了更多信息
  • 添加了更多信息
  • 检查名为 array 的 JavaScript 变量,看看你得到了什么。
  • 已经试过了,array = null ...在我尝试的上面添加了一些代码

标签: jquery ruby-on-rails ruby ajax ruby-on-rails-4


【解决方案1】:

我认为你是在混合两个不同的概念。

Rails 可以处理不同类型/格式的请求,例如 html(默认)、json、js、xml 等。

在您的代码中看不到控制器如何处理请求,因此我将其作为 html 处理。

另一方面,jquery 不知道您在服务器中使用的技术,因此尝试打印控制器变量是行不通的。

进行以下更改以尝试解决此问题:

users#search_user

users = User.where("lastname LIKE ?", "#{params[:search]}%")

respond_to do |format|
  format.json { render json: { results: users.map{ |u| { id: u.id, lastname: u.name } } } }
end

在你看来:

$.ajax({
        url: '<%= url_for( :controller => :users , :action => :search_user) %>',
        data: {search: $("#suchfeld").val()},
        dataType: 'json'
      }).done(function (data) {
        alert(data);
      })

更新 您可以使用JSON.stringify 查看“数据”对象:

alert(JSON.stringify(data));

控制器还返回一个具有以下格式的对象:

{ results: [{id: 1, lastname: 'foo'}, {id: 2, lastname: 'bar'}] }

所以如果你想获得第一个姓氏,你应该使用类似:data.results[0].lastname

【讨论】:

  • 得到这个错误:SyntaxError (/var/www/xyz/app/controllers/users_controller.rb:218: syntax error, unexpected ':', expecting '}' format.json { results: userss .map{ |u| { id: u.id, ... ^): app/controllers/users_controller.rb:218: 语法错误,意外':',期待'}'
  • 好的,但我不需要字符串。我想迭代结果。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-29
  • 2011-08-01
  • 2013-02-18
  • 2019-08-18
相关资源
最近更新 更多