Sinatra'post'路线没有调用模板。

时间:2014-01-08 20:13:14

标签: javascript ajax post sinatra

我有一个使用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”将打印到终端,然后显示警报,但页面只是坐在那里而不会更新。 我甚至尝试过后续路线中的重定向呼叫,但这也不起作用。有什么想法吗?

1 个答案:

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