2011-03-18 67 views
0

想象一下有3个选项的下拉菜单:A,B,C和ID为myform的div。 当用户从列表中选择一个选项时,应将div的内容替换为与该选项相对应的表单。事情是,形式没有共同之处。如何创建此动态表单?

我想以下列方式解决这个的:

  • 创建一个新的控制器FormCreator
  • 创建一个新的动作build_form,这将需要一个类型作为参数(A/B/C)
  • 创建A.html.erbB.html.erbC.html.erb
  • 取决于类型,我将呈现或者A/B/C,与布局呈现禁用
  • 使用ajax替换控制器生产的div的内容

有没有更好的方法来做到这一点?

回答

1

这里的准则我会怎么做:当一些选项,例如A,使用AJAX GET AController#new作为JSON并返回erb呈现的表单。比$('#myForm')。html(withResponse)。主要思想是,在select.change事件中,您可以启用正确的资源控制器新操作,并用它的响应替换div内容。

不完整的答案,但我希望它会给你一个想法

0

为什么不只隐藏表单并在选择列表选择时显示/隐藏它们?从哪个控制器或操作呈现表单/选择列表并不重要,但它们可能应发布到其自己的控制器,并仅在呈现验证失败时呈现之前发布的表单。

0

使用选择与打电话给你的AJAX控制器一个javascript:平变化=> remote_function(...)

在你的控制器=>

def FormCreator 
    if params[:form] == 1 
    render :update do |page| 
     page.replace_html 'form_div', :partial => 'form_1' 
     #make a file with just the form called _form_1.erb, this is called a partial 
     #because the file name starts with '_' 
     #form_div is the id of the div that holds all 3 forms. 
    end 
    end 
    #repeat for all forms 
end 
+0

有可能这样做的一个更合适的方法,但它的早期,昨天是圣帕特里克节,这将让你开始... – 2011-03-18 12:40:16

+0

但是,如果我发布到与当前不同的控制器,这仍然适用? – Geo 2011-03-18 14:30:50

+0

是的,你可以这样调用它:remote_function(:url => {:controller =>'formstuff',:action =>'FormCreator'} ......) – 2011-03-18 19:07:09