【问题标题】:Rails 4 - sending devise params to a User model methodRails 4 - 将设计参数发送到用户模型方法
【发布时间】:2014-07-24 06:42:54
【问题描述】:

我有自己的RegistrationsController,它继承自 Devise。在更新中,我想将params 发送到我的User 方法,如下所示:

def update
   params = resource.delete_invoice(params) if resource.check_invoice(params[:user])
   if params[:user][:name].blank?
      flash[:alert] = t 'devise.registrations.wrong_user_name'
      redirect_to action: 'edit' and return
  end
  super
end

不幸的是我得到了错误:

NoMethodError in Users::RegistrationsController#update, undefined method `[]' for nil:NilClass 

这很奇怪,因为我通常可以写puts params,而且它不是空的。我该如何解决这个问题?

【问题讨论】:

    标签: ruby-on-rails devise params nomethoderror


    【解决方案1】:

    试试这个:

    unless params[:user].blank?
      if params[:user][:name].blank?
        #do your stuff
      end
    end
    

    【讨论】:

    • 你误会了我。尝试调用 checkinvoice 时,第一行出现错误。
    【解决方案2】:

    这里的错误是它试图在 nil 对象上调用 [],因为 params 或 flash 不太可能是 nil,您调用 [] 的唯一其他地方是在 params[:user] 上,这表明这是零。

    几个选项,检查 params[:user] 是否为 nil 或使用 try:

    if params[:user].nil? or params[:user][:name].blank?
          flash[:alert] = t 'devise.registrations.wrong_user_name'
          redirect_to action: 'edit' and return
    end  
    

    或者:

    if params[:user].try(:fetch, :name).try(:blank?)
          flash[:alert] = t 'devise.registrations.wrong_user_name'
          redirect_to action: 'edit' and return
    end
    

    我认为更整洁。注意 try 是一种 rails 方法,而不是 ruby​​。

    【讨论】:

      【解决方案3】:

      你确定资源是在你运行更新时构建的吗?在 Rails 4 中,build_resource 是在该方法 devise/registrations_controller 中构建的。可能你想使用resource_class

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-26
        相关资源
        最近更新 更多