最后我决定考虑我自己的js_form_builder资源,所以我有一个控制器来传递它。控制器采用可选的resource_name和id参数。如果提供,可以实例化,像这样的对象:
@object = params[:resource_name].classify.constantize.find(params[:id])
然后,我只是发下来有载内的所有我js_form_builder善良一个js.erb模板。如果@object已被实例化,那么我可以创建一个form_for @object,然后遍历它的属性并在javascript表单构建器对象上创建方法,该方法将使用Rails FormBuilder标记创建它们,从而为每个属性返回输入。
例如:
window.FormBuilder = function() {
var builder = {};
builder.form = function() {
var js = "";
js += '<%= form_for @object do |f| %>';
<% @object.attributes.each do |name, val| %>
var methodName = '<%= name.camelize(:lower) %>';
<% if val.class == String %>
builder[methodName] = $('<%= f.text_field name.to_sym %>');
<% end %>
<% if val.class == TrueClass || val.class == FalseClass %>
builder[methodName] = $('<%= f.check_box name.to_sym %> <%= f.label name.to_sym %>');
<% end %>
<% end %>
js += '<% end %>';
return $(js);
};
builder.newForm = function() {
var js = "";
js += '<%= form_for @object.class.new do |f| %>';
js += '<% end %>';
}
return builder;
}
我不能肯定目前这些投入将多么有用,因为我不认为这样一个场景,我不会只使用html.erb这些的。但它确实很有趣,使其工作! :)
我这样做的原因是因为我想我的application.js能够吐出Rails窗体标签。我的应用程序在AJAX和js中很繁重,我想要集中的方法,它们给了我Rails窗体,输入等。基本上,我试图创建一个JavaScript FormBuilder。 因此,在我的application.js中,我会对我的自定义操作进行AJAX调用,该操作会发送一个js.erb文件。这个文件会有一个FormBuilder“class”,其中的方法给了我由rails表单生成器标记生成的html。所以当我的application.js调用deleteWithAjax()时,我可以用Rails标签生成Rails表单。 – Samo 2010-10-22 15:53:38
这听起来像一个非常有趣的想法,它可以很好地工作,但问题是为什么它需要从标准REST操作中分离出这么多。您真正需要的是为您的方法定义JavaScript响应器,以便正确处理表单。如果没有找到模板,则可以通过截取并自动处理.js响应的生成,而不是通过引入新操作来更轻松地完成此操作。 – tadman 2010-10-22 16:25:46
这是一个有趣的想法。你能否指点我一个这样的例子?到目前为止,在所有情况下,我对ajax调用的响应是js.erb模板或json对象。我希望返回的js.erb模板和json响应的处理程序都可以访问我的js表单构建器。所以没有模板发现的情况可能是不够的。也许另一种选择是将js_form_builder作为只响应get的资源,并且我的application.js文件可以调用该控制器来加载表单构建器。 – Samo 2010-10-22 17:51:30