我为提前发出嘶嘶声而道歉,但我最近在Rails中发现了JSON,我真的很想创建一个分解为几页的表单。然后,数据将通过JSON对象从一个页面传送到另一个页面。
我坚持如何正确地做到这一点。
表单的第一页是:
控制器:
def create
# removed some code here for the sake of simplicity
if @card_signup.save
respond_to do |wants|
wants.html {}
wants.json { render :json => { :html => (render_to_string :partial => 'final_form')}}
end
else
respond_to do |wants|
wants.html { render :new }
wants.json { render :json => { :errors => @card_signup.errors } }
end
end
end
处理将第一个表单保存到此控制器的Javascript
$(".step_two_submit").click(function(){
$("#new_card_signup").attr("action", function(index, action) {
var values = [],
getKey;
$("#sortable").sortable('serialize').replace(/(\w+?)\[]=(\d+?)/g, function(all, key, number) {
values.push(number);
getKey = key;
});
var cardSignupGetParams = 'card_signup=' + getKey + '[' + values.join(', ') + ']';
return action + '?' + cardSignupGetParams + "&foo[]=bar";
});
});
这是艰难的部分!我想这样做,以便我验证这个表单是否像往常一样正确编写。没问题,表单已经设置好了。但是当他们点击下一步时,我希望他们转到第二个表单,这是免责声明,他们必须在保存对象之前同意。
因此,如果他们退出或不批准免责声明,则该对象将永远不会被创建。
要实现这一点..我假设我需要代替保存对象,我需要将对象存储在JSON对象中并通过AJAX将其传递给下一个AJAX加载的免责声明页面。
有谁知道我怎么能把它拼接在一起?
如果这没有多大意义,我再次道歉。
答案 0 :(得分:1)
您真正想要做的是在转到页面的第二部分之前验证对象。如果您肯定想要往返服务器,可以在“检查”操作的控制器中使用@card_signup.valid?
而不是@card_signup.save
,然后使用javascript隐藏表单元素并显示您的免责声明。通过这种方式,您仍然会检查在最终提交时保存,但实际上并未将其保存到数据库中。
在没有javascript的情况下执行此操作的另一种方法是将第一页提交给刚检查有效对象的控制器操作,然后转到第二页,然后将大多数表单元素呈现为隐藏元素,有效地携带填写的表格到第二页而不保存。
或者,您可以尽可能在客户端进行验证,而不是点击服务器。请参阅Client Side Validations railscast,了解完成此操作的有趣且简单的方法。