我正在尝试使用AJAX请求在同一页面中创建一个简单的应用程序来加载数据。
这是.rb代码:
get '/' do
erb :index
end
post '/ssearch' do
if request.xhr?
keyword = params[:key]
items = extract_cse_info(keyword)
erb :ssearch, :locals => { 'items' => items }
else
erb :index
end
end
这里有layout.erb
加载的.js文件$(document).ready(function(){
$('.SR_title').hide();
$('#msg').hide();
$('.SR_box').hover(function(){
$(this).find('.SR_title').toggle().stop(true, true);
$(this).toggleClass('SR_box_hover');
});
$("#searchform").submit(function(){
var form = $("#searchform"),
term = form.find( "input[name='key']" ).val(),
url = form.attr("action");
$.ajax({
type: "POST",
url: url,
data: term,
success: function(msg){
$('#msg').html(msg);
}
});
});
这里有index.erb代码
<div class="search">
<form method="POST" action="/ssearch" id="searchform">
<input id="search" type="search" name="key" autocomplete="on" placeholder="search qui..." />
<button class="submit" type="submit">Go!</button>
</form>
<div id="msg"></div>
</div>
和ssearch.erb执行一些东西。
<% i = 1 %>
<% items["items"].each do |x| %>
<div class="SR_box">
<div class="SR_title">
<h5>Title</h5>
<a class="SR_box_fs fa fa-arrows-alt" href="#"></a>
</div>
<iframe class="iframe" src=<%= "#{x['link']}"%> sandbox="allow-same-origin, allow-top-navigation, allow-forms"></iframe>
</div>
<% end %>
当我得到/ all都没问题,但是当执行搜索时没有任何反应,浏览器只显示没有在ssearch.erb中创建的框架的表单。为什么? 只是提示显示一条服务器错误消息,上面写着:
http://localhost:4567 - &gt; / SSEARCH NoMethodError - nil的未定义方法'each':NilClass: ssearch.erb:2:在'block in singletonclass'中
答案 0 :(得分:0)
哦哦哦,问题很简单(现在)。
Sinatra不接受jquery ajax请求中'data:'参数中的变量,你必须以这种方式写明(在我的例子中):
data: { term: form.find("input[name='key']" ).val()},
while before之前写道:
term = form.find( "input[name='key']" ).val(),
...
data: term,
然后我用这种方式修改一下.rb文件:
@keyword = params[:term]
puts "keyword is #{@keyword}"
@items = extract_cse_info(@keyword)
puts @items
erb :ssearch, :layout => false
现在我在七个天堂,我喜欢成为这种情感的新手:)
再见