Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/20.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 500使用ajax的rails中的内部服务器错误_Ruby On Rails_Ruby_Ajax_Ruby On Rails 4 - Fatal编程技术网

Ruby on rails 500使用ajax的rails中的内部服务器错误

Ruby on rails 500使用ajax的rails中的内部服务器错误,ruby-on-rails,ruby,ajax,ruby-on-rails-4,Ruby On Rails,Ruby,Ajax,Ruby On Rails 4,我正在尝试创建一个文本框,其中显示已排序用户的列表,这些用户按照每个键入的字母进行排序。从那里,用户可以将用户添加为协作者。当你搜索添加新朋友时,结果应该有点像facebook的搜索功能。当我按键时,我在浏览器控制台的网络部分看到一个新的500内部服务器错误。以下是响应的一个片段: <h1> NoMethodError in CollaborationsController#collaboration_search </h1> </head

我正在尝试创建一个文本框,其中显示已排序用户的列表,这些用户按照每个键入的字母进行排序。从那里,用户可以将用户添加为协作者。当你搜索添加新朋友时,结果应该有点像facebook的搜索功能。当我按键时,我在浏览器控制台的网络部分看到一个新的500内部服务器错误。以下是响应的一个片段:

 <h1>
    NoMethodError
      in CollaborationsController#collaboration_search
  </h1>
</header>

<div id="container">
  <h2>undefined method `[]&#39; for nil:NilClass</h2>
以下是collaborations controller中的协作#搜索"协作操作:

 def collaboration_search
  name_search = params[:collaboration][:user_name].to_s
  @users_by_name = User.where('name Like ?', "%#{params[:collaboration][:user_name]}%")
   render json: @users_by_name.map do |user|
     { name: user.name, id: user.id}
  end
puts "PARAMS: #{params.inspect}"
结束

出于测试目的,我将我的协作/search_collaboration.js.erb保持得非常简单:

alert('hello');

但是,如果有人能为我指出正确的方向,告诉我如何列出协作搜索操作返回的用户的姓名,我将不胜感激

您尝试构建的用户体验术语是“自动完成”下拉列表或“自动完成”组合框。它实际上是一个相当复杂的UI元素,我不会从头开始编程。您应该使用像JQuery这样的库。JQuery内置于核心Rails中,因此我只需要包含正确的库。下面是来自JQuery的元素示例

您可以使用浏览器开发工具查看源代码

这里是JQuery自动完成文档

你可以看看你的代码

这里是另一个实现

该错误似乎表明您试图将某个内容作为散列进行索引,而实际上它是零:

undefined method `[]&#39; for nil:NilClass
[]
引用散列索引——例如
params[:collaboration]
。我的直接猜测是,您没有以预期的格式向该控制器操作提供参数,因此
params[:collaboration]
nil
,您试图索引到该
params[:collaboration][:user_name]
,从而引发所述错误

这与您当前的jQuery代码相结合,它根本不发送数据(您将
文本作为参数发送到哪里,无论是在querystring中还是作为jQuery.ajax()参数),更不用说以那种特定的格式了

您可以这样做:

$.ajax({ url: "/collaborations?collaboration=#{text}",
   #..etc
或者,您可以使用
ajax
函数的数据方法将参数作为哈希值提供给它,而不只是将其扔到URL中。该功能的文档应该为您提供更多信息

我强烈推荐后者,因为您希望在控制器
[:collaboration][:user\u name]
中使用嵌套哈希,这在querystring参数中不容易支持

为了了解参数是如何输入的,我建议在Ruby控制器中加入如下内容:

 def collaboration_search
  name_search = params[:collaboration][:user_name].to_s
  @users_by_name = User.where('name Like ?', "%#{params[:collaboration][:user_name]}%")
   render json: @users_by_name.map do |user|
     { name: user.name, id: user.id}
  end
puts "PARAMS: #{params.inspect}"
这应该超过任何导致错误的因素。它将打印出服务器日志中的参数(您在终端选项卡中键入
rails server
rails s
),这样您就可以看到参数是什么,这个假设是否准确,以及如何解决问题

最后一点,我认为您实际上根本没有访问
.js.erb
文件。您的操作只是返回对jQuery ajax函数的响应。该响应在调用
done()
的函数中,响应数据在当前代码中称为
数据。一旦您通过此错误,我会提醒
data
,以查看控制器是如何序列化的。然后,如果没有
js.erb
文件,只需使用jQuery的结果更新DOM即可


(最后一点,我想不出有哪种情况需要测试
if-console&&console.log
,我不确定该测试不会出错。不过,我可能错了。)

这不是答案。这只是关于
jQuery
lib的链接。滚动您自己的自动完成路线对于学习来说是一个有用的练习,但是要让所有用户(例如依赖屏幕阅读器的用户)都能访问它,需要做大量的工作。如果您按照建议选择第三方widget,或者选择其他类似的widget,如Twitter Bootstrap附带的widget,希望您已经注意到了可访问性细节。至少要注意HTML5的datalist元素(在撰写本文时很遗憾)。