2010-09-15 56 views
5

我有一个电子邮件表格。但是,我正在制作一个测试电子邮件表单,用户可以添加一封唯一的电子邮件,并通过电子邮件测试将其发送到该特定的电子邮件。如何将AJAX的vars从jQuery传递到他们的控制器?

为了方便起见,我决定通过ajax使测试电子邮件执行,并将整个内容粘贴到其他电子邮件表单中。

我无法弄清楚如何从我的HAML变量发送到我的控制器

new.html.haml

- form_tag admin_email_blast_path do 
    Subject 
    %br 
    = text_field_tag 'subject', :class => "mass_email_subject" 
    %br 
    Body 
    %br 
    = text_area_tag 'message', '', :name => 'editor1', :class => "mass_email_body" 
    %br/ 
    = submit_tag 'Send Email', :class => 'button' 

    .grid_3.right.align_right.suffix_1 # <= TEST EMAIL :D 
    = text_field_tag 'email', nil, :style => "width: 150px;", :class => "test_email_address" 
    = link_to 'Test Email', test_email_admin_email_blast_path, :class => 'button test_email' 

JS

$(".test_email").live("click", function() { 

    var email = $(".test_email_address") 
    var subject = $(".mass_email_subject"); 
    var body = $(".mass_email_body"); 

    data = "email=" + email.val() + "&subject" + subject.val() + "&body" + body.val(); 

    $.ajax({type: "GET", 
      url: $(this).attr("href"), 
      dataType: "script" 
      data: data 
      }); 
    return false; 
}); 

控制器

def test_email 
    debugger 
    email = params[:email] 
    subject = params[:subject] 
    body = params[:body] 
    Notifier.deliver_email_blast(email, subject, body) 
end 

的routes.rb

admin.resource :email_blast, :member => { 
           :test_email => :get 
           } 

我道歉提前如果这是一个愚蠢的新手问题。 :(

+1

test_email_admin_email_blast_path是否接受GET请求? (尝试使用“rake routes | grep test_email_admin_email_blast”来查看Rails如何解释您的routes.rb) – tobym 2010-09-15 18:41:59

+0

是的。 test_email_admin_email_blast GET /admin/email_blast/test_email(.:format){:controller =>“admin/email_blasts”,:action =>“test_email”} – Trip 2010-09-15 19:05:36

回答

7

您可以使用data参数:

$('.test_email').live('click', function() { 

    var subject = $('.mass_email_subject'); 
    var body = $('.mass_email_body'); 

    $.ajax({ 
     type: 'GET', 
     url: this.href, 
     dataType: 'script', 
     data: { subject: subject.val(), body: body.val() } 
    }); 
    return false; 
}); 
+0

是的,但是如何连接到我的轨道控制器?如何为我的通知程序设置增值税? – Trip 2010-09-15 17:10:10

+1

所有这些都是向'/ testemail /?subject = foo&body = bar'发送一个AJAX请求并执行从此控制器操作返回的JavaScript。 – 2010-09-15 17:25:18

+0

对。我把那部分弄下来了。但它并没有回答我的问题,这些变量如何被轨道控制器读取。尽管如此,我很欣赏帮助。 – Trip 2010-09-15 17:31:21

3

假设你正在提交基于达林季米特洛夫回答,那么你需要使用params对象才能正常工作。在这种情况下,它看起来像所有。你需要做的就是访问PARAMS [:主题],而params [:身体]。在你的控制器动作

编辑:

在回应的意见,GET和POST做出PARAMS没有差别形式不工作,请尝试修改你JS使用序列化和在失败时返回一个错误:

$(".test_email").live("click", function() { 

    var subject = $(".mass_email_subject") 
    var body = $(".mass_email_body") 

    $.ajax({type: "GET", 
      url: $(this).attr("href"), 
      dataType: "script" 
      data: $('#form_id').serialize(), 
      error: function(){ alert("There was a problem, please try again.") } 
      }); 
    return false; 
}); 

如果仍不能再工作,你更好看,看看你的控制器动作被击中的。

+0

下面的表格不起作用。这些变量不会传递给params [:subject]或任何其他变量。那是因为它是“GET”而不是“POST”?我尝试了两种方法,同时确保我的路线成员是:发布请求。当routes.rb请求和ajax请求是POST时,我得到'只允许发布请求。当他们都GET,我得到一个零参数。 – Trip 2010-09-15 18:11:02

+0

控制器正在被击中。当我定义params之前,我把调试器放在了前面。但是一旦我到达那里,它们都被定义为“无”。奇怪的权利?我尝试了你的serialize()方法,并在我的表单周围放置了一个唯一的ID,但它没有给出。 – Trip 2010-09-15 18:36:52

+1

“def test_email”之后你的调试器到底在哪里? – tobym 2010-09-15 19:22:01

相关问题