Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/52.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 如果之前受邀参加Desive invitable,我如何覆盖destroy?_Ruby On Rails_Ruby On Rails 3_Devise - Fatal编程技术网

Ruby on rails 如果之前受邀参加Desive invitable,我如何覆盖destroy?

Ruby on rails 如果之前受邀参加Desive invitable,我如何覆盖destroy?,ruby-on-rails,ruby-on-rails-3,devise,Ruby On Rails,Ruby On Rails 3,Devise,我正在Rails 3应用程序中使用designe\u invitable和designe。我想让我的用户能够邀请其他用户,并在被邀请者注册之前对这些被邀请的用户进行分组 我的问题是,一旦被邀请者出现并注册(但不使用邀请URL),就会出现destroy\u if\u previous\u investedaround\u过滤器,销毁原始用户记录并为用户重新创建新记录,保留邀请数据,但不随邀请一起传输用户组记录 我只想通过搜索与最初邀请的用户id匹配的任何用户组,并用新创建的用户id保存它们,来覆盖

我正在Rails 3应用程序中使用
designe\u invitable
designe
。我想让我的用户能够邀请其他用户,并在被邀请者注册之前对这些被邀请的用户进行分组

我的问题是,一旦被邀请者出现并注册(但不使用邀请URL),就会出现
destroy\u if\u previous\u invested
around\u过滤器,销毁原始用户记录并为用户重新创建新记录,保留邀请数据,但不随邀请一起传输用户组记录

我只想通过搜索与最初邀请的用户id匹配的任何用户组,并用新创建的用户id保存它们,来覆盖这个环绕\u过滤器

我不断得到错误:

LocalJumpError in Users::RegistrationsController#create

no block given (yield)
我的路线如下所示:

devise_for :users, :controllers => { :registrations => "users/registrations" }
class Users::RegistrationsController < Devise::RegistrationsController
  protected

  def destroy_if_previously_invited
    hash = params[resource_name]
    if hash && hash[:email]
      resource = resource_class.where(:email => hash[:email], :encrypted_password => '').first
      if resource
        @old_id = resource.id #saving the old id for use in reset_invitation_info
        @invitation_info = Hash[resource.invitation_fields.map {|field|
          [field, resource.send(field)]
        }]
        resource.destroy
      end
    end
  end

  def reset_invitation_info
    # Restore info about the last invitation (for later reference)
    # Reset the invitation_info only, if invited_by_id is still nil at this stage:
    resource = resource_class.where(:email => params[resource_name][:email], :invited_by_id => nil).first
    if resource && @invitation_info
      resource.invitation_fields.each do |field|
        resource.send("#{field}=", @invitation_info[field])
      end
      ### Adding your code here
      if @old_id
        user_groups = UserGroup.find_all_by_user_id(@old_id)
        for user_group in user_groups do
          user_group.user_id = resource.id
          user_group.save!
        end
      end
      ### End of your code
      resource.save!
    end
  end
我已在app/controllers/users/registrations\u controller.rb中将其设置为覆盖:

class Users::RegistrationsController < Devise::RegistrationsController

  around_filter :destroy_if_previously_invited, :only => :create


  private    

  def destroy_if_previously_invited
    invitation_info = {}

    user_hash = params[:user]
    if user_hash && user_hash[:email]
      @user = User.find_by_email_and_encrypted_password(user_hash[:email], '')
      if @user
        invitation_info[:invitation_sent_at] = @user[:invitation_sent_at]
        invitation_info[:invited_by_id] = @user[:invited_by_id]
        invitation_info[:invited_by_type] = @user[:invited_by_type]
        invitation_info[:user_id] = @user[:id]
        @user.destroy
      end
    end

    # execute the action (create)
    yield
    # Note that the after_filter is executed at THIS position !

    # Restore info about the last invitation (for later reference)
    # Reset the invitation_info only, if invited_by_id is still nil at this stage:
    @user = User.find_by_email_and_invited_by_id(user_hash[:email], nil)
    if @user
      @user[:invitation_sent_at] = invitation_info[:invitation_sent_at]
      @user[:invited_by_id] = invitation_info[:invited_by_id]
      @user[:invited_by_type] = invitation_info[:invited_by_type]
      user_groups = UserGroup.find_all_by_user_id(invitation_info[:user_id])
      for user_group in user_groups do
        user_group.user_id = @user.id
        user_group.save!
      end
      @user.save!
    end
  end
end
类用户::注册控制器<设计::注册控制器
环绕\u筛选器:如果\u以前被邀请,则销毁\u,:only=>:create
私有的
def销毁(如果之前邀请)
邀请信息={}
user_hash=params[:user]
if user\u hash&&user\u hash[:电子邮件]
@用户=用户。通过电子邮件和加密密码查找(用户哈希[:电子邮件],“”)
如果@user
邀请信息[:邀请发送地址]=@user[:邀请发送地址]
邀请人信息[:邀请人id]=@user[:邀请人id]
邀请信息[:受邀请类型]=@user[:受邀请类型]
邀请信息[:用户\u id]=@user[:id]
@用户破坏
结束
结束
#执行操作(创建)
产量
#请注意,在此位置执行after_过滤器!
#还原有关上次邀请的信息(供以后参考)
#仅重置邀请信息,如果邀请者id在此阶段仍然为零:
@用户=用户。通过电子邮件查找和通过id邀请(用户哈希[:电子邮件],无)
如果@user
@用户[:邀请发送时间]=邀请信息[:邀请发送时间]
@用户[:受邀请的用户id]=邀请信息[:受邀请的用户id]
@用户[:按类型邀请]=邀请信息[:按类型邀请]
用户组=用户组。按用户id查找所有用户(邀请信息[:用户id])
对于用户组中的用户组,请执行以下操作
user\u group.user\u id=@user.id
用户_group.save!
结束
@user.save!
结束
结束
结束

我也可能只是把这一切都搞错了。如果您有任何想法,我们将不胜感激。

首先,无需再次设置环绕过滤器,因为Desive\u invitable已经设置了此选项。您所需要做的就是重新定义UsersController中的方法,这些方法将被调用,而不是designe_不可修改的方法

第二,看起来您将这两种方法结合在一起,而这两种方法应该保持分离并被覆盖(我是基于Desive_Invitable 1.1.1的最新版本)

试着这样做:

devise_for :users, :controllers => { :registrations => "users/registrations" }
class Users::RegistrationsController < Devise::RegistrationsController
  protected

  def destroy_if_previously_invited
    hash = params[resource_name]
    if hash && hash[:email]
      resource = resource_class.where(:email => hash[:email], :encrypted_password => '').first
      if resource
        @old_id = resource.id #saving the old id for use in reset_invitation_info
        @invitation_info = Hash[resource.invitation_fields.map {|field|
          [field, resource.send(field)]
        }]
        resource.destroy
      end
    end
  end

  def reset_invitation_info
    # Restore info about the last invitation (for later reference)
    # Reset the invitation_info only, if invited_by_id is still nil at this stage:
    resource = resource_class.where(:email => params[resource_name][:email], :invited_by_id => nil).first
    if resource && @invitation_info
      resource.invitation_fields.each do |field|
        resource.send("#{field}=", @invitation_info[field])
      end
      ### Adding your code here
      if @old_id
        user_groups = UserGroup.find_all_by_user_id(@old_id)
        for user_group in user_groups do
          user_group.user_id = resource.id
          user_group.save!
        end
      end
      ### End of your code
      resource.save!
    end
  end
类用户::注册控制器<设计::注册控制器
受保护的
def销毁(如果之前邀请)
hash=params[资源名称]
if hash&&hash[:电子邮件]
resource=resource\u类。其中(:email=>hash[:email],:encrypted\u password=>“”)。首先
如果资源
@old_id=resource.id#保存旧id以用于重置邀请信息
@邀请_info=Hash[resource.invitation_fields.map{| field|
[字段,资源。发送(字段)]
}]
资源破坏
结束
结束
结束
def重置邀请信息
#还原有关上次邀请的信息(供以后参考)
#仅重置邀请信息,如果邀请者id在此阶段仍然为零:
resource=resource\u类。其中(:email=>params[resource\u name][:email],:invested\u by\u id=>nil)。首先
如果资源&&@邀请信息
resource.investment|u字段。每个do|字段|
resource.send(“#{field}=”,@invitation_info[field])
结束
###在这里添加代码
如果@old_id
用户组=用户组。通过用户id(@old\u id)查找所有用户
对于用户组中的用户组,请执行以下操作
user\u group.user\u id=resource.id
用户_group.save!
结束
结束
###代码的结尾
资源节约!
结束
结束

谢谢-这真的很有帮助!升级到最新版本的
designe\u invitable
似乎是关键所在。