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

Ruby on rails 控制器中的回调对我不起作用,ruby-on-rails,ruby-on-rails-3,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 fa

我的控制器中有以下代码:

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
我使用以下命令调用新方法:

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

如果我已经发送了3个邀请,为什么我可以访问new和create方法

我不知道答案,但我想知道答案的第一步是回答以下问题:

1实际调用的是您的before筛选器吗

2过滤器中当前用户是否正确

3当前用户邀请是否正确

4返回false是否实际执行


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

我以前从未使用过远程链接,所以我不确定这部分,但如果您希望format.js{}实际运行,您肯定需要在format.js{}之后返回false。一旦ruby命中返回语句,方法执行就会停止

更新: 你的评论并不完全清楚你改变了什么。但如果您希望渲染发生,则该方法应如下所示:

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_块中。

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

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

谢谢,我在日志中获得了正确的当前_user.investments.size。对于本例2。然后,如果我能在日志中看到正确的当前_user.investments.size。为什么不触发条件的返回false?:O.如果我输入方法def,请发送邀请!返回false end无任何情况发生:O。在其他控制器中工作良好,此过滤器适用于甲烷储罐。你能在问题中为上述方法写一个例子吗?。非常感谢你!如果我这样写:如果当前_user.investments.size>1 format.js返回false结束,我会得到错误:ArgumentError参数太少…引发错误的行是这样的行:format.js{render:text=>您不能发送更多邀请}当满足此条件时返回false