grails controller / action / id自动转换为控制器/索引

时间:2014-09-17 21:53:20

标签: grails-2.0

我的问题是后端服务器(用grails编写)会自动将我的请求URL转换为不同的URL。具体来说,它正在将其从/ UXChallengeAwards / processSelectedNotifications更改为/ UXChallengeAwards / index。

-

在模板gsp文件中,我定义了一个按钮,当点击它时会调用jQuery ajax:

<button class="blue-link"
    onclick="jQuery.ajax({type:'POST', 
    data:jQuery(this).parents('.multiSelectForm').serialize(), 
    url: '/ici/UXChallengeAwards/processSelectedNotifications/${challenge.id}',
    success:function(data,textStatus){},
    error:function(xhr,textStatus,errorThrown){}
    })"  >

方法UXChallengeAwardsController.processSelectedNotifications存在。它执行一些工作,然后重定向到控制器中的另一个操作。事实上,这曾经工作过。但不知何故,在添加第二个按钮的过程中,我做了一个改变,似乎已经破坏了。

现在单击该按钮时,请求URL将切换到/ ici / UXChallengeAwards / index并返回404,因为索引不存在于此控制器中的操作。

我已经google了,最常见的答案是控制器必须为视图返回一些结果。但是我在控制器中看到了很多重定向的例子,我看不出我做错了什么。 (我确实尝试过渲染结果的变体,但没有成功。)

以下是我的控制器操作:

  def  processSelectedNotifications = {
      def challenge
      def checkboxes = params.list('selectCheckbox');
      for (checkbox in checkboxes) {  
      // the checkbox contains the id of a ChallangeAward that should be published
         ChallengeAwards challengeAwards = ChallengeAwards.get(checkbox.toInteger())
         if (challengeAwards) {
            // grab a challenge for use in the redirect, they are all the same
            challenge=challengeAwards.challenge
            publish(challengeAwards)
          }
      }       
      if (challenge) {
        redirect  action: 'challengeAwardsRemote', id: challenge.id
        return      
      }

      // render a failure message if we got here
      render messageNS(code:"UX.ChallengeAwards.Publish.failure")
    }

我真的很感激任何可能出错的见解,或者如何处理这个问题。我已经检查了我的UrlMappings,这是应该处理此控制器/方法请求的规则:

"/$controller/$action?/$id?"{  constraints {} }

非常感谢!

1 个答案:

答案 0 :(得分:0)

我将继续回答我自己的问题,以防它对其他新手有帮助。

事实证明我没有得到自动重定向。相反,我在按钮设置代码中出错,因此grails使用其默认链接行为。 (这是转到与视图匹配的控制器,如果未指定任何操作,请使用索引方法。)

上面的代码最初是使用remoteSubmit标记创建的,但我发现生成的代码不支持在单个页面上处理多个表单。所以,我复制了生成的代码,然后调整它来处理多个表单。但是,我希望样式与页面上已有的样式相匹配,因此我将其切换为按钮。事情出了差错的时候。

最终,我最终为按钮指定了onClick函数,然后在javascript中编写了ajax提交代码。结果证明要简单得多。

以下是按钮规范的结果:

<button type="submit" id="notifications" class="blue-link"   >
<i class="fa fa-envelope-o"></i>
<g:messageNS
code="UX.DiscussionBoard.ChallengeAward.Button.notify" />   
</button>

以及相关的JavaScript:

    jQuery(document).ready(function() {  
    var clkBtn = "";
    jQuery('button[type="submit"]').click(function(evt) {
    clkBtn = evt.target.id;
    });

    jQuery('.multiSelectForm').submit(function()  {

    var url = '/ici/UXChallengeAwards/processSelectedNotifications';
    if (clkBtn == 'deletes') {
    url ='/ici/UXChallengeAwards/processSelectedDeletes';
    } 

    var errorTarget = jQuery(this).parents().find('.recipientMessage').val();
    var requestData = jQuery(this).parents('.multiSelectForm').serialize();
    var options = {
    data : requestData,
    type : 'POST',
    url : url,
    target : '#awardsTab',
    error : function(data) {
    jQuery('#' + errorTarget).html(data.responseText).show();
    },
    success : function(data) {
    console.log("in success");
    }
    };

jQuery(this).ajaxSubmit(options);
return false;
});
相关问题