【问题标题】:Passing a (Sinatra) Ruby value to Javascript将(Sinatra)Ruby 值传递给 Javascript
【发布时间】:2013-06-15 12:13:55
【问题描述】:

所以,我正在制作一个订阅表单。

jQuery

    $("<div id='dialog' title='Subscribe!'> <form id='subscribe_form' method='POST' action='/user/subscribe'>" +
        "<input type='text' name='subscribe_email' id='email' placeholder='Email Address'> <br/>" +
        "<button id='submit_subscribe_form'>Submit</button></p><p id='ruby_bool'></p></form>" +
        "</div>").appendTo($("#subscribe"));

提交此表单后,它会向 Ruby Sinatra 侦听器发送一个 ajax 调用(抱歉,如果我没有使用正确的术语,还没有真正学习过 Sinatra,只是展示了如何使用它)

 $('form').submit(function(){
        $.ajax({
            type: "POST",
            url: "/user/subscribe",
            data: $('form').serialize(),
            success: function()
            {

红宝石代码

 post "/user/subscribe" do

user_Information = EmailList.new

if params[:subscribe_email] =~ /^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,4})$/
  user_Information.email = params[:subscribe_email]
  puts user_Information.save
  @email_validation_result = "True"
else
  @email_validation_result = "False"
end

puts @email_validation_result

(是的,我知道我不应该使用正则表达式,但我能找到的引擎是用于 PHP 的) 我想使用@email 验证结果,这样我就可以知道要在我的成功中添加什么:调用我的 ajax。问题是,JavaScript 不允许 Ruby 注入(根据我的天知道研究了多少小时),我无法更新包含该变量异步的网页上的 div。我想全部异步执行此操作,因此不会刷新整个页面。 (如果不可能,否则我会承认,但我非常怀疑)。我试图将 div 放在另一个页面上并使用 JQuery .load() 函数,但 .erb 文件无法识别。 没有想法,几乎没有理智。 谢谢!

【问题讨论】:

  • 您确实明白,您的电子邮件验证并没有告诉您最重要的事情,即该地址实际上会将邮件发送给某人。与其浪费代码检查提交的字符串是否与规范的部分实现相匹配,只需发送一封电子邮件询问用户是否希望创建帐户。当用户点击您的验证链接时,该帐户就会得到验证。

标签: javascript jquery ruby sinatra


【解决方案1】:

JavaScript:

$.post( '/user/subscribe', $('form').serialize(), function(data){
  // Do whatever you want with the response from the server here
  // data is a JavaScript object.
}, 'json');

鲁比/西纳特拉:

require 'json' # just for a convenient way to serialize

post '/user/subscribe' do
  # process the params however you want

  content_type 'application/json'
  { :ok => @is_ok }.to_json
end

如果没有 JSON 库,您可以只使用一些有效的 JSON 标记来结束您的方法,例如:

%Q[ { "ok":#{@is_ok} } ]

JavaScript/AJAX 将发布到服务器,匹配的 Sinatra 路由将处理请求,该方法的字符串结果(not 通过puts 完成)将作为响应发送到方法。 jQuery AJAX 处理程序将接收它,将其解析为 JSON 并调用您的回调函数,将它创建的 JavaScript 对象作为参数传递。然后你可以根据需要修改你的 HTML DOM,客户端。

【讨论】:

  • 对不起,另一个问题。我实现了你的代码,并做了一个 console.log(data);这表明 ok: 清楚地显示了正确的值。我只是不知道如何访问它。我尝试了几种不同的 json 解析方法,data(),data{},data[] 和简单的 :ok,但都没有。再次感谢!
  • 非常感谢!你完全拯救了我的理智。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-31
  • 1970-01-01
  • 2013-07-05
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2013-07-02
相关资源
最近更新 更多