Rails如何通过Ajax调用返回javascript:更新控制器动作

时间:2011-04-21 06:59:02

标签: javascript ruby-on-rails ajax validation modal-dialog

我正在制作弹出模式框以提交表单。如果存在验证问题,表单应该刷新,但仍然在模态框内。这适用于添加新记录,我相信它正在调用:create action,POST。我想使用相同的模态框来编辑记录。到目前为止,我可以在模态框中打开它,但只要有错误,它就会重定向到另一个页面,而不是留在框内。我认为ajax没有调用动作来返回javascript以将表单放回模态框中。如何让ajax将javascript返回到模式框以更正表单?

示例,这是我的:创建动作:

def create 
@user = User.new(params[:user])

respond_to do |format|
  if @user.save
    format.js { render :redirect } #this is for modalform     
    format.html { redirect_to(users_url, :notice => 'User was successfully created.') }
  else
    format.html {render :new}
    format.js # this renders the create.js.erb file to keep the form inside
  end
end
end  

这是加载模态框并保持表单内部的javascript,直到验证正确为止:

document.observe('dom:loaded', function() {
$('newuser-link').observe('click', function(event) {
    event.stop();
    Modalbox.show(this.href,
        {title: 'Create',
        width: 500, #up to this point, this opens the form in the modal box
        afterLoad: function() { # this afterload part is supposed to keep the form inside the modal box
            $('new_user').observe('submit', function(event) {
                event.stop();
                this.request();
            })
        }}
    );
   });
 })  

以下是:.js.erb文件,如果存在验证错误,则:create动作会调用以保持表单在模式框内:

$('MB_content').update("<%= escape_javascript(render :partial => 'form') %>");
Modalbox.resizeToContent();
$('new_users').observe('submit', function(event) {
event.stop();
this.request();
});

由于这适用于:create action,当我想编辑记录时,如何让它适用于:update动作?同样,主要问题是当存在验证错误时,它会重定向到模态框之外。

更新
我发现在javascript中应该保持模态框打开的部分:

$('new_user').observe('submit', function(event) {
                event.stop();
                this.request();  

'new_user'是表单的id。使用此编辑记录时,表单的ID为edit_user_1或edit_user_32或正在编辑的任何用户。所以我想这里的解决方案,我无法弄清楚,是如何在javascript中使用一个类作为选择器而不是id。因为当我手动输入'edit_user_1'并且我正在编辑id为1的用户时,它可以工作......但显然不适用于任何其他用户。

1 个答案:

答案 0 :(得分:1)

而不是使用ModalBox我最终使用FaceBox(这里的教程):

http://net.tutsplus.com/tutorials/ruby/how-to-build-an-unobtrusive-login-system-in-rails/

几乎相同,但在为选择器添加类或id方面似乎更灵活。此外,当涉及到动态,rails生成id时,我使用了一个小jQuery来创建一个变量来获取动态链接并将其传递给选择器:

var myid = jQuery('#userform').children().attr('id');

然后,它要求我传递的形式的id

'#' + myid  

无论如何,我按照上面的教程开始工作,甚至可以修改它以添加新用户并编辑一个。