控制器中的回调对我不起作用

时间:2012-03-06 16:06:01

标签: ruby-on-rails ruby-on-rails-3

我的控制器中有这个代码:

class InvitationsController < ApplicationController

before_filter :invitations_sent!

def new
 #code here
end

def create
 #code here
end

  private
   def invitations_sent!
    if current_user.invitations.size > 1
      return false
      format.js { render :text => "you can not send more invitations" }
    else
    return true
    end         
   end
end

我用以下方法调用new方法:

<%=link_to "Invite Friends", new_invitations_path, :remote =>true, :id => "invite_to_friends" %>

为什么我可以访问新方法并创建如果我已发送3个邀请?

3 个答案:

答案 0 :(得分:0)

我不知道答案,但我解决这个问题的第一步是回答这些问题:

1)您的前置过滤器是否实际被调用?

2)过滤器中的current_user是否正确?

3)current_user邀请是否正确?

4)return false实际上是否被执行了?

您可以通过添加raise语句或致电puts来查看过滤器中发生的情况。

答案 1 :(得分:0)

之前我从未使用过远程链接,因此我不确定该部分,但如果您希望return false实际运行,那么format.js { }肯定需要format.js { }。一旦ruby命中一个return语句,方法就会停止执行。

<强>更新 你的评论并没有完全清楚你改变了什么。但是如果你想让渲染完全发生,那么这个方法应该是这样的:

def invitations_sent!
  if current_user.invitations.size > 1
    respond_to do |format|
      format.js { render :text => "you can not send more invitations" }
    end
    return false
  else
    return true
  end         
 end

没关系,渲染块不行。它应该包含在如上所述的respond_to块中。

答案 2 :(得分:0)

这是返回true / false的另一种方法。

respond_to do |format|
    format.js { render :nothing => true, :status => 200, :content_type => 'text/json' }
end