我有一个使用Sinatra用Ruby编写的简单应用程序。我正在尝试根据表单中写入的信息创建一个实时更新页面的表单。例如,表单具有“名称”字段。用户填写姓名,按“go”,页面(不刷新)显示“Welcome {name}”。
这就是我的工作:
我的app.rb
get '/examples' do
erb :example
end
post '/examples' do
post = params[:post]
@name = post['name']
puts "HERE"
erb :example
end
我的example.erb文件(不是整个文件,只有表单)
<% if @name then %>
<%= @name %>
<% end %>
<form id="myForm" action="/examples" method="post">
Name: <input type="text" name="post[name]" />
<input type="submit" value="Submit Name" />
</form>
我的JS档案:
// bind 'myForm' and provide a simple callback function
$('#myForm').ajaxForm(function() {
alert("Thank you for your comment!");
});
它在我的app.rb文件中处于帖子路径的底部。 “HERE”将打印到终端,然后显示警报,但页面只是坐在那里而不会更新。 我甚至尝试过后续路线中的重定向呼叫,但这也不起作用。有什么想法吗?
答案 0 :(得分:0)
我假设您正在使用jQuery Form Plugin?如果是这样 - 我认为发生的事情是jQuery正在拦截和执行帖子,这意味着页面(和视图)不会被重新加载;因此&lt;%= @ name%&gt;永远不会被评估(因为@name在最初加载视图时不可用)。
您可能希望使用jQuery Form的选项,这些选项允许您设置将使用帖子的响应更新的目标HTML元素(请参阅示例here)。
我还建议给响应提供自己的视图,否则你最终会在example.erb视图中返回其他所有内容作为响应的一部分。
更新了example.erb:
<div id="output1">
</div>
<form id="myForm" action="/examples" method="post">
Name: <input type="text" name="post[name]" />
<input type="submit" value="Submit Name" />
</form>
<script>
$(document).ready(function() {
var options = {
target: '#output1', // target element(s) to be updated with server response
};
// bind 'myForm' and provide a simple callback function
$('#myForm').ajaxForm(options, function() {
alert("Thank you for your comment!");
});
});
</script>
更新了web.rb
get '/examples' do
erb :example
end
post '/examples' do
post = params[:post]
@name = post['name']
puts "HERE "
erb :response
end
新视图 - response.erb:
<% if @name then %>
<%= @name %>
<% end %>