如何将AJAX变量从jQuery传递给控制器​​?

时间:2010-09-15 16:48:19

标签: jquery ruby-on-rails ruby ajax

我有一封电子邮件表格。但我正在制作测试电子邮件表单,用户可以在其中添加唯一的电子邮件,并将电子邮件测试发送到该特定电子邮件。

为了方便起见,我决定通过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
                                }
如果这是一个愚蠢的新手问题,我提前道歉。 :(

2 个答案:

答案 0 :(得分: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;
});

答案 1 :(得分:3)

假设您根据Darin Dimitrov回答提交工作正常,那么您需要使用params对象。在这种情况下,您需要做的就是在控制器操作中访问params [:subject]和params [:body]。

编辑:

在回应评论时,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;
});

如果它仍然不起作用,那么你最好看看你的控制器动作是否正在被击中。