【问题标题】:Nil Current_user in modified Devise create action修改后的设计创建操作中的 Current_user 为零
【发布时间】:2014-08-14 13:44:53
【问题描述】:

我为 Devise 创建了一个自定义注册控制器。我在我的表单中插入了一个参数,如果它是真的,我应该在注册后做一些额外的事情,例如,为用户创建一个相关的公司。

class RegistrationsController < Devise::RegistrationsController
  before_filter :authenticate_user!, :only => :token

  def new
    super
  end

  def create
    super
    reg_type = params['reg_type']
    if reg_type=='1'
      current_user.create_default_company!
    end    
  end

  def update
    super
  end

end 

但是,我的 current_user 将为零。

undefined method `create_default_company!' for nil:NilClass

在调用 super 之后,我可以使用什么来立即引用 current_user,从而创建用户。

参数:

 Parameters: {"utf8"=>"✓", "authenticity_token"=>"E1urosfkmekwweklo/HZaEVrrmxQVKO9E=", "user"=>{"name"=>"", "email"=>"4@Gmail.com", "password"=>"[FILTERED]", "password_confirmation"=>"[FILTERED]"}, "commit"=>"Sign up", "reg_type"=>"1"}

我正在传递参数,使用两个链接:

new_user_registration_path(reg_type: '0')
new_user_registration_path(reg_type: '1')

创建的动作取决于用户选择的链接。

【问题讨论】:

  • 您显然是在 nil 上调用该方法,因为 current_user 为 nil(如果他还没有创建/签名,怎么可能是其他方式?)。您可以在 after_create 回调中检查此参数,然后创建默认公司
  • 我的印象是在create上调用super后,用户登录,用户就创建好了。是否有显示设计过程的参考资料?另外,reg_type 不是我的用户模型中的字段,也不是方法,我将如何创建一个 aftercreate 回调来引用 reg_type?我发布了我的参数
  • 什么是reg_type,如果它不是字段也不是方法?
  • 这只是我表单中的一个参数,告诉我以不同的方式处理创建。
  • hm,不知道如何访问注册参数..它是如何定义的?

标签: ruby-on-rails devise


【解决方案1】:

您可以在after_create 回调中检查此reg_type 参数,然后如果它等于'1',则创建默认公司。

【讨论】:

  • 我最终将 reg_type 参数放入 User 模型中,有没有办法在不放入 USER[] 的情况下从模型中检查 params[]?
【解决方案2】:

如果你打开 devise gem,你会发现 create 方法为

(设计-3.2.4)

 def create
    build_resource(sign_up_params)

    if resource.save
      yield resource if block_given?
      if resource.active_for_authentication?
        set_flash_message :notice, :signed_up if is_flashing_format?
        sign_up(resource_name, resource)
        respond_with resource, location: after_sign_up_path_for(resource)
      else
        set_flash_message :notice, :"signed_up_but_#{resource.inactive_message}" if is_flashing_format?
        expire_data_after_sign_in!
        respond_with resource, location: after_inactive_sign_up_path_for(resource)
      end 
    else
      clean_up_passwords resource
      respond_with resource
    end 
  end

您应该首先检查您使用的是哪个版本的设备,然后您可以在控制器中覆盖该方法。

简而言之,使用资源代替 current_user 可能会解决您的问题,但它可能会产生不适当的结果,因为您只会在渲染模板后分配属性(而不是保存)。

【讨论】:

    【解决方案3】:

    您应该能够通过将块传递给super 来访问新用户:

    def create
       super do |resource|
         if params['reg_type'] == "1"
            resource.create_default_company!
          end
        end
      end
    

    这在“配置控制器”下的docs 中有解释(嗯,至少提到)。

    新用户可通过块参数resource 访问,尽管此时可能不会保存。

    【讨论】:

      【解决方案4】:

      首先,感谢所有 cmets。我的解决方案是使用带有 after_create 回调的 andrey deineko 建议。我添加了一个 attr_accessor 来引用权限,我将其作为隐藏字段添加到表单中。

      我用过..

      class User < ActiveRecord::Base
      
        attr_accessor :reg_type
        after_create  :create_default_company!, if: :is_reg?
      
       def is_reg?
          @reg_type == '1'
        end
      ...
      
      end
      

      它似乎运作良好。谢谢大家的建议。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-08-27
        • 1970-01-01
        • 2011-07-15
        • 1970-01-01
        • 2014-02-23
        • 2012-06-10
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多