加价还是捣蛋?嵌套表格

时间:2011-11-06 08:56:24

标签: html ruby-on-rails-3 forms paperclip

有一个有趣的任务:我的活跃记录' 活动 '实体可以包含一个' 附件' PDF文件。在“创建活动”页面上,用户可以在提交该活动之前上传此附件。附件通过Ajax上传到Amazon,进度条显示等blablabla 。 它应该显示在in_a_way:

= form_for @event do |e|
  = e.text_field :name

  = form_for @attach, :remote=>true, html=>{:multipart=>true} do |at|
    = at.file_field :pdf, :accept=>"pdf", :size=>"1"
    = at.submit

  = e.submit

是的,这只是伪代码,我不介意它是如何工作的,但主要的想法是礼物: [提交附件] 按钮应放在在里面事件表格。 我如何实现它?也许,只需对嵌套的Attachment表单进行一些偏移,这样它就会显示在Event表单中,还是有其他解决方案?

............................................... ....... php_vs_rails ...................................... ..............

1 个答案:

答案 0 :(得分:1)

解决方案:覆盖表单标题 这是用于创建新事件的表单。 在此表单中,我们需要ajax文件上传。 有一个解决方案:在两种不同类型的提交之间混合单一形式:ajax(js)和html:

= form_for @event, html=>{:multipart=>true} do |e|
  = e.text_field :name

  = file_field_tag "attach[pdf]", :id=>"attach_pdf", :accept => "pdf", :maxlength => "200"
  = submit_tag "", :id => "ajax_submit", :style=>"display:none"

  = e.submit    <!-- id = "new_event_submit" -->

////////////////////////////
// before 'submits' call override functions:

$("#ajax_submit").click(function(){
    prepeareFormForAjax();
    return true;
});

$("#new_event_submit").click(function(){
  prepeareFormForHtml();
  return true;
});

//////////////////////////////
// to store original (previous, html) form data
var html_form_action = "";
var html_form_method = "";
///////////////////////////////

/* 
 * To ajax file upload:
 **/
function prepeareFormForAjax() {
  $("form").attr("data-remote", "true");
  $("form").attr("enctype", "multipart/form-data");  

  html_form_action = $("form").attr("action");  // save old action
  $("form").attr("action", "/attach");            // I need /nors action

  //_method field is a hidden form field, maybe you have it too on the page:
  if ($('input[name="_method"]').length != 0) {
    html_form_method = $('input[name="_method"]').val();
    $('input[name="_method"]').val("post");
  }

}

function prepeareFormForHtml() {
  $("form").removeAttr("data-remote");
  $("form").removeAttr("enctype");
  if (html_form_action != "") {
    $("form").attr("action", html_form_action);
    html_form_action = "";
  }
  if (html_form_method != "") {
    $('input[name="_method"]').val(html_form_method);
    html_form_method = "";
  }
}

///////////////////////

现在,通过AJAX上传文件:

$("#ajax_submit").click();

有任何问题吗?