最後我決定考慮我自己的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